Распределенные вычисления в C # - PullRequest
4 голосов
/ 08 августа 2011

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

Я хочу запустить этот метод DLL на 900 тыс. Слов, и это задание может повторяться каждыенеделю.Как я могу легко распределить эту работу по нескольким системам, чтобы сэкономить время, используя c #?

Ответы [ 5 ]

15 голосов
/ 08 августа 2011

Ответ в форме: Требование - Инструмент

Запланированные прогоны - Quartz.NET

Кварц позволяет запускать «задания» по любому заданному расписанию.Он также поддерживает состояние между запусками, поэтому, если по какой-то причине сервер выходит из строя, когда он возвращается, он знает, что должен начать работу.Довольно классные вещи.

Распределенная очередь - NServiceBus

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

Очередь -> Работник1 + = Работник 2 + = Работник 3 -> Локальное хранилище данных -> Очередь данных+ Рабочие -> Удаленное хранилище данных

Кэш данных - RavenDb или SQLite

В основном для того, чтобы обеспечить возвращаемые значения заданногооперации достаточно изолированы от SQL Server, который вы хотите удостовериться, и кэшируйте значение где-нибудь в локальной системе хранения.Это может быть что-то быстрое и нереляционное, как RavenDB, или что-то структурированное, как SQLite.Затем вы бросаете какой-то идентификатор в другую очередь через NServiceBus и синхронизируете его с SQL Server, очереди - ваш друг!: -)

Асинхронные операции - Библиотека параллельных задач и TPL DataFlow

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

Еще одна интересная вещь, появившаяся в новой Async CTP, - TPL DataFlow.Я этим не пользовался, но, похоже, прямо в твоем переулке!

4 голосов
/ 08 августа 2011

Поскольку это существующий код, я бы искал способ разделить этот список из 900 тыс. Слов.

Все остальное потребует гораздо больше изменений.

2 голосов
/ 08 августа 2011

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

2 голосов
/ 08 августа 2011

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

GJ

1 голос
/ 24 апреля 2013

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

Как вы уже описали, у вас есть 750 часов обработки плюс небольшие накладные расходы.Если вы можете разделить работу на 40 потоков обработки, вы можете сделать все это менее чем за 20 часов.Разделить работу - это легкая часть.

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

  1. Вы можете вручную разделить список слов по запросу или некоторому другому устройству и запускать отдельные и уникальные консольные приложения на каждом узле / рабочей станции, которые будут использоватьTPL для максимального использования каждого логического процессора каждой машины.

  2. Вы можете использовать что-нибудь MPAPI и кодировать свои собственные узлы и рабочих.

  3. Вы можете установить Windows Server на своем узле / рабочих станциях и запустить Microsoft HPC и использовать что-то вроде MPI.NET , чтобы запустить задания.

  4. Вы можете написать консольное приложение и использовать DuoVia.MpiVisor для распространения и выполнения на своих рабочих станциях.(Полное раскрытие: я автор MpiVisor)

Удачи вам.

...