Контакт с огромным набором результатов SQL

Я работаю с довольно большой mysql базой данных (несколько миллионов строк) со столбцом, хранящим изображения блоба. Приложение пытается захватить подмножество изображений и выполняет некоторые алгоритмы обработки на них. Проблема, с которой я сталкиваюсь, состоит в том, что, из-за довольно большого набора данных, который я имею, набор данных, который возвращает мой запрос, является слишком большим для хранения в памяти.

В настоящее время я изменил запрос для не возврата изображений. При итерации по набору результатов я выполняю другой выбор, который захватывает отдельное изображение, которое касается текущей записи. Это работает, но десятки тысяч дополнительных запросов привели к снижению производительности, которое недопустимо.

Моя следующая идея состоит в том, чтобы ограничить исходный запрос приблизительно 10,000 результатов и затем продолжать запрашивать по промежуткам 10 000 строк. Это походит на середину дорожного компромисса между двумя подходами. Я чувствую, что существует, вероятно, лучшее решение, о котором я не знаю. Там должен иначе только иметь части гигантского набора результатов в памяти за один раз?

Удачи,

Dave McClelland

9
задан Dave McClelland 25 March 2010 в 14:11
поделиться

4 ответа

Один из вариантов - использовать DataReader. Он передает данные в потоковом режиме, но это происходит за счет сохранения открытого соединения с базой данных. Если вы повторяете несколько миллионов строк и выполняете обработку для каждой из них, это может быть нежелательно.

Я думаю, вы идете по правильному пути, собирая данные по частям, возможно, используя метод MySql Limit, верно?

3
ответ дан 3 November 2019 в 07:47
поделиться

Я вижу 2 варианта.

1) если это приложение для Windows (в отличие от веб-приложения), вы можете читать каждое изображение с помощью устройства чтения данных и выгружать файл во временную папку на диске, после чего вы можете выполнять любую необходимую обработку. физический файл.

2) Чтение и обработка данных небольшими порциями. 10 тыс. Строк все равно может быть много, в зависимости от размера изображений и объема обработки, которую вы хотите выполнить. Возврат 5 КБ строк за раз и чтение большего количества в отдельном потоке, когда у вас осталось до 1 КБ, может сделать процесс плавным.

Кроме того, хотя это не всегда рекомендуется, принудительная сборка мусора перед обработкой следующего набора строк может помочь освободить память.

0
ответ дан 3 November 2019 в 07:47
поделиться

При работе с такими большими наборами данных важно не нужно иметь все сразу в памяти. Если вы записываете результат на диск или на веб-страницу, делайте это, читая каждую строку. Не ждите, пока вы прочитаете все строки, прежде чем начинать писать.

Вы также можете установить для изображений значение DelayLoad = true , чтобы они загружались только тогда, когда они вам нужны, а не реализовывали эту функцию самостоятельно. См. здесь для получения дополнительной информации.

1
ответ дан 3 November 2019 в 07:47
поделиться

Раньше я использовал решение, подобное тому, что описано в этом руководстве: http://www.asp.net/ (S (pdfrohu0ajmwt445fanvj2r3)) / learn / data-access / tutorial- 25-cs.aspx

Вы можете использовать многопоточность для предварительного извлечения части следующих нескольких наборов данных (сначала вытащите 1–10 000, а в фоновом режиме - 10 001–20 000 и 20 001–30 000 строк; и удалите предыдущие. страниц данных (скажем, если вы находитесь на уровне от 50 000 до 60 000, удалите первые 1-10 000 строк, чтобы сохранить память, если это проблема). И используйте местоположение пользователя на текущей «странице» в качестве указателя для извлечения следующего диапазона данных или удалите некоторые данные за пределами допустимого диапазона.

0
ответ дан 3 November 2019 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: