2009-05-07 2 views
3

Я работаю над проблемой, когда мне нужно выполнять много неловко параллелизуемых задач. Задача создается путем чтения данных из базы данных, но набор всех задач будет превышать объем памяти на машине, поэтому задачи должны быть созданы, обработаны и удалены. Мне интересно, что было бы хорошим подходом к решению этой проблемы? Я имею в виду следующие два подхода:Смущающе параллелизуемые задачи в .NET.

  1. Внедрить синхронизированную очередь задач. Внедрите производителя (создателя задачи), который считывает данные из базы данных и ставит задачу в очередь (ограничьте количество задач, находящихся в настоящее время в очереди, до постоянного значения, чтобы убедиться, что объем памяти не превышен). Имейте несколько потребительских процессов (процессор задач), которые читают задачу из очереди, обрабатывают задачу, сохраняют результат и удаляют задачу. Каким будет большое количество потребительских процессов в этом подходе?

  2. Используйте параллельное расширение .NET (PLINQ или параллельное для), но я понимаю, что необходимо создать набор задач (можем ли мы добавлять задачи к коллекции при обработке в параллельной для?). Таким образом, мы создадим пакет задач - скажем, N задач за один раз и обработаем эти партии задач и прочитаем еще одну задачу N.

Что вы думаете об этих двух подходах?

ответ

4

Используйте ThreadPool с ограниченной очередью, чтобы избежать подавления системы.

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

Если ваши задачи CPU не связаны, то вам придется поэкспериментировать с размером бассейна, чтобы получить оптимальное решение для вашей конкретной ситуации

Вы можете поэкспериментировать с любым подходом, чтобы добраться до оптимальной конфигурации ,

В основном, проверяйте, настраивайте, проверяйте, повторите, пока вы не будете счастливы.

+0

Использование ThreadPool для неловко параллельных задач не даст лучших результатов. Наилучшими результатами было бы использовать фиксированное количество рабочих потоков (равное количеству ядер в машине), возможно, потоку производителя. Это то, что делает библиотека параллельной задачи. –

+0

Что вы видите как недостаток использования ThreadPool в этом случае? Наличие количества потоков, равных количеству ядер, в большинстве случаев дает субоптимальные результаты, если какая-либо из задач должна ждать, пропустить кеш, другие операции ввода-вывода и т. Д. Единственный способ добраться до оптимального числа потоков, чтобы экспериментировать и измерять ваши результаты для вашей конкретной задачи. – Glen

+0

@Pop Catalin: вы можете установить фиксированный размер для ThreadPool. –

1

Звучит как работа для Microsoft HPC Server 2008. Учитывая, что количество заданий является ошеломляющим, вам нужен какой-то параллельный диспетчер процессов. Вот что такое сервер HPC.

http://www.microsoft.com/hpc/en/us/default.aspx

+0

Это кажется немного излишним, хотя я могу ошибаться. –

2

Используйте ThreadPool.

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

3

У меня не было возможности фактически использовать PLINQ, однако я знаю, что PLINQ (например, vanilla LINQ) основан на IEnumerable. Таким образом, я думаю, что это может быть случай, когда было бы целесообразно реализовать создателя задачи с помощью блоков итератора C# (т. Е. Ключевое слово yield).

Предполагая, что вы не выполняете никаких операций, когда весь набор задач должен быть известен заранее (например, заказ), я ожидал бы, что PLINQ будет потреблять столько задач, сколько он мог бы обрабатывать сразу. Кроме того, this article ссылается на некоторые стратегии контроля только того, как PLINQ идет о потреблении ввода (раздел «Обработка запроса»).

EDIT: Сравнение PLINQ с ThreadPool.

Согласно this MSDN article, эффективное распределение работы в пуле потоков вовсе не тривиально, и даже когда вы делаете это «правильно», использование TPL обычно демонстрирует лучшую производительность.

+0

Кто-нибудь знает, что если я использую PLINQ, он адаптивно отрегулирует количество потоков? Скажем, на 8-ядерном компьютере, в основном нет другого процесса, так что PLINQ создает 8 потоков (возможно, 7 рабочих и 1 производитель), но позже есть некоторые другие процессы, запущенные на машине, следовательно, число потоков работника/производителя будет сокращено? –

+0

Я не читал ничего, что предполагает, что PLINQ (или TPL, на котором основан PLINQ) делает это. С другой стороны, учитывая динамические стратегии распределения TPL, сокращение количества потоков, вероятно, будет в большинстве случаев анти-оптимизацией. –

0

Для того, чтобы дать хороший ответ, нам нужно получить несколько вопросов.

Является ли каждая отдельная задача параллелизуемой? Или каждая задача является продуктом параллелизуемой основной задачи?

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

+0

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

+0

Количество задач ... это много задач :-) Так звучит так, будто у вас есть что-то, что создает задачи для выполнения, а задачи могут создавать подпрограммы (распараллеливание алгоритма), которые также выполняются. Что я могу сделать, это использовать ограниченную очередь, где в Q могут существовать только N задач, а Q-блоки при добавлении к Q при подсчете задач == N. Тогда у вас может быть X число процессоров задач, вытягивающих из Q., поскольку процессоры задач вытягиваются из Q, Q открывается и позволяет заблокированной задаче добавить новую задачу в Q. и так далее и т. Д. – Turbo

-1

Похоже, Windows Workflow Foundation (WF) может быть полезно использовать для этого. Это может также дать вам некоторые дополнительные преимущества, такие как пауза/возобновление ваших задач.

+0

Поскольку все задания WWF работают в одном потоке, в значительной степени бесполезно для мелкозернистого параллелизма. – Gabe

 Смежные вопросы

  • Нет связанных вопросов^_^