Параллелизуйте поиск контента из базы данных, поиск и хранить как html

StackOverflow https://stackoverflow.com/questions/3509355

Вопрос

У меня есть таблица баз данных, имеющая HTML -контент, хранящийся в виде бинарной сериализованной капли. Мне нужно получить контент один за другим, ищите определенные ключевые слова в контенте (и сообщить о найденных совпадениях), а также сохранить контент на диск в качестве файлов HTML. Могу ли я параллизировать это с помощью parallel.foreach? Это хорошая идея или есть лучшая.

Заранее спасибо за помощь, Ашиш

Это было полезно?

Решение

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

Я думаю, что вам просто нужно попробовать оба пути и измерить разницу, чтобы увидеть, действительно ли это работает для вас. Очевидно, что это не будет иметь значения на одной основной машине, но 8 -основная машина, обрабатывающая только два файла, также может не увидеть каких -либо существенных преимуществ, если поиск ключевых слов не займет много времени на файл, то выполнение их параллельно снова получает полезное. :) Я думаю, что вам лучше всего попробовать пару различных шипов на различных методах и выяснить, что лучше для вас и вашей ситуации.

Другие советы

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

Я бы сделал подход производителя потребителя (http://en.wikipedia.org/wiki/producer-consumer_problem):

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

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

В этом случае вы можете одновременно выполнять запросы и обработку.

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

Чтобы проверить, есть ли это так, вы можете сделать продюсера/потребителя с более чем одним производителем (то есть более чем одним потоком, который запросил базу данных).

Я надеюсь, что это помогает.

Эдуардо

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top