Задачи C # TPL - сколько за один раз - PullRequest
7 голосов
/ 15 декабря 2010

Я учусь использовать TPL для парелизации приложения, которое у меня есть.Приложение обрабатывает файлы ZIP, извлекает все содержащиеся в них файлы и импортирует содержимое в базу данных.Может быть несколько тысяч почтовых файлов, ожидающих обработки в определенный момент времени.

Прав ли я, выполняя отдельную задачу для каждого из этих ZIP-файлов, или это неэффективный способ использования TPL?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 15 декабря 2010

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

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

1 голос
/ 15 декабря 2010

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

Это похоже на то, что вам нужно измерить, чтобы получить правильный ответ на вопрос, что лучше.

1 голос
/ 15 декабря 2010

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

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

Я должен не согласиться с некоторыми утверждениями здесь, ребята.

Прежде всего, я не вижу никакой разницы между ThreadPool и Задачами в координации или управлении.Особенно, когда задачи выполняются в ThreadPool, и вы легко можете управлять задачами, исключения приятно распространяются на вызывающую сторону во время ожидания или ожидания на задачах. Когда все (задачи) и т. Д.

Во-вторых, ввод-вывод не должен бытьздесь только узкое место, в зависимости от данных и уровня сжатия ZIP-файл займет гораздо больше времени, чем чтение файла с диска.

Об этом можно думать по-разному, но я бы лучшечто-то вроде количества ядер ЦП или чуть меньше.

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

Оттуда вы можете настроитьколичество ядер и игра с балансировкой нагрузки.

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

ВАУ, это вопрос 6 лет, облом!Я не заметил ...:)

...