Распараллелить поиск контента из базы данных, выполнить поиск и сохранить в формате HTML - PullRequest
0 голосов
/ 18 августа 2010

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

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

Ответы [ 3 ]

1 голос
/ 18 августа 2010

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

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

1 голос
/ 18 августа 2010

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

0 голосов
/ 18 августа 2010

Я бы применил подход «производитель-потребитель» (http://en.wikipedia.org/wiki/Producer-consumer_problem):

)

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

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

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

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

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

Надеюсь, это поможет.

Эдуардо

...