Я работаю над проблемой, когда мне нужно выполнять много неловко параллелизуемых задач. Задача создается путем чтения данных из базы данных, но набор всех задач будет превышать объем памяти на машине, поэтому задачи должны быть созданы, обработаны и удалены. Мне интересно, что было бы хорошим подходом к решению этой проблемы? Я имею в виду следующие два подхода:Смущающе параллелизуемые задачи в .NET.
Внедрить синхронизированную очередь задач. Внедрите производителя (создателя задачи), который считывает данные из базы данных и ставит задачу в очередь (ограничьте количество задач, находящихся в настоящее время в очереди, до постоянного значения, чтобы убедиться, что объем памяти не превышен). Имейте несколько потребительских процессов (процессор задач), которые читают задачу из очереди, обрабатывают задачу, сохраняют результат и удаляют задачу. Каким будет большое количество потребительских процессов в этом подходе?
Используйте параллельное расширение .NET (PLINQ или параллельное для), но я понимаю, что необходимо создать набор задач (можем ли мы добавлять задачи к коллекции при обработке в параллельной для?). Таким образом, мы создадим пакет задач - скажем, N задач за один раз и обработаем эти партии задач и прочитаем еще одну задачу N.
Что вы думаете об этих двух подходах?
Использование ThreadPool для неловко параллельных задач не даст лучших результатов. Наилучшими результатами было бы использовать фиксированное количество рабочих потоков (равное количеству ядер в машине), возможно, потоку производителя. Это то, что делает библиотека параллельной задачи. –
Что вы видите как недостаток использования ThreadPool в этом случае? Наличие количества потоков, равных количеству ядер, в большинстве случаев дает субоптимальные результаты, если какая-либо из задач должна ждать, пропустить кеш, другие операции ввода-вывода и т. Д. Единственный способ добраться до оптимального числа потоков, чтобы экспериментировать и измерять ваши результаты для вашей конкретной задачи. – Glen
@Pop Catalin: вы можете установить фиксированный размер для ThreadPool. –