Распараллелить пакетное приложение - PullRequest
0 голосов
/ 20 июля 2009

В настоящее время я работаю над приложением, которое анализирует огромные XML-файлы.

Для каждого файла будут разные процессы, но все они будут проанализированы в одной объектной модели.

В настоящее время объекты, проанализированные из каждого файла XML, будут помещены в одну коллекцию.

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

Глядя на график ЦП, когда это приложение работает, ясно, что оно использует только часть ЦП (одно ядро ​​за раз на 100%), поэтому я предполагаю, что его параллельная работа поможет сократить время работы.

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

Ответы [ 3 ]

0 голосов
/ 20 июля 2009

Вместо того, чтобы пытаться самостоятельно управлять потоками (что может быть сложной задачей), я предлагаю использовать параллельную библиотеку. Посмотрите на PLINQ / TPL , что будет в .Net. CTP можно скачать здесь .

0 голосов
/ 20 июля 2009

Я бы предложил вам следующую технику: создайте очередь объектов, ожидающих обработки, и удалите их из нескольких потоков:

  1. Создайте XmlReader и начните читать файл с узла за узлом, пока неEOF.
  2. Как только вы встретите закрывающий тег, вы можете сериализовать его содержимое в объект.
  3. Поместить сериализованный объект в очередь.
  4. Проверьте количество объектов вочереди и, если она больше N, запустите новый поток из ThreadPool, который будет извлекать из очереди <= N объектов и обрабатывать их. </li>

Доступ к очереди необходимо синхронизировать, посколькуВы будете ставить в очередь и удалять объекты из нескольких потоков.

Сложность состоит в том, чтобы найти N таким образом, чтобы все ядра ЦП работали одновременно.

0 голосов
/ 20 июля 2009

Я предлагаю вам взглянуть на использование потоков вместо параллельного программирования.

Учебник по потокам

...