Параллелизуйте поиск контента из базы данных, поиск и хранить как html
-
29-09-2019 - |
Вопрос
У меня есть таблица баз данных, имеющая HTML -контент, хранящийся в виде бинарной сериализованной капли. Мне нужно получить контент один за другим, ищите определенные ключевые слова в контенте (и сообщить о найденных совпадениях), а также сохранить контент на диск в качестве файлов HTML. Могу ли я параллизировать это с помощью parallel.foreach? Это хорошая идея или есть лучшая.
Заранее спасибо за помощь, Ашиш
Решение
Я подозреваю, что если вы сможете вытащить набор рядов из базы данных в один запрос и обработаете каждый параллельно в поисках ключевых слов, а затем сохранив партию обратно на диск за один шаг, вы увидите значительные преимущества. Если вы выбираете один за другим и обрабатываете их линейным образом, вы увидите минимальные преимущества от дела обстоятляются параллельно.
Я думаю, что вам просто нужно попробовать оба пути и измерить разницу, чтобы увидеть, действительно ли это работает для вас. Очевидно, что это не будет иметь значения на одной основной машине, но 8 -основная машина, обрабатывающая только два файла, также может не увидеть каких -либо существенных преимуществ, если поиск ключевых слов не займет много времени на файл, то выполнение их параллельно снова получает полезное. :) Я думаю, что вам лучше всего попробовать пару различных шипов на различных методах и выяснить, что лучше для вас и вашей ситуации.
Другие советы
Производительность ввода/вывода в базе данных и диске будет намного медленнее, чем скорость вашего процессора, что вы, вероятно, не увидите никакой заметной выгоды от параллелизации.
Я бы сделал подход производителя потребителя (http://en.wikipedia.org/wiki/producer-consumer_problem):
Один поток запрашивает вашу базу данных (если возможно через какой -то курсор, чтобы вы могли сделать это один за другим) и помещает каждую строку в буфере.
Другой поток (или, может быть, более одного, если поиск требует действительно большой обработки), - это получение одной строки базы данных (с помощью HTML -Blob) и обработки поиска.
В этом случае вы можете одновременно выполнять запросы и обработку.
Я не верю, что вы получите большую выгоду от производительности от единственного факта, что вполне вероятно, что ваши запросы занимают гораздо больше времени, чем обработка. Проблема заключается в том, что в запросе, чтение дисков в качестве узкого места. В конце концов, ваш диск, скорее всего, будет тем, кто ограничивает вашу общую производительность.
Чтобы проверить, есть ли это так, вы можете сделать продюсера/потребителя с более чем одним производителем (то есть более чем одним потоком, который запросил базу данных).
Я надеюсь, что это помогает.
Эдуардо