Вопрос

Я хочу получить перспективу сообщества на этом. Если у меня есть процесс, который сильно DB / IO связан, насколько SMART будет параллелизовать отдельные пути процессов, используя параллельную библиотеку задач?

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

  1. Запрос БД для списка предметов
  2. Сделайте некоторые операции агрегации для группировки определенных предметов на основе динамического списка параметров.
  3. Для каждого сгруппированного результата запрашивайте базу данных для чего-то на основе агрегированного результата.
  4. Для каждого сгруппированного результата каковы числовые вычисления (3 и 4 произойдут последовательно).
  5. Есть несколько вложений и обновлений для результата, рассчитанного в # 3
  6. Выполните некоторые вставки и обновления для каждого элемента, возвращаемого в # 1

Логически говоря, я могу распараллелизовать в график задач на шагах № 3, № 5, № 6 как один элемент не имеет подшипника на результате предыдущего. Тем не менее, каждый из них будет ждать в базе данных (SQL Server), которая в порядке, и я понимаю, что мы можем только обрабатывать, насколько это возможно, поскольку SQL Server позволит нам.

Но я хочу логически распространять задачу на локальной машине, чтобы она обрабатывала так быстро, как база данных позволяет нам не дождаться чего-либо нашего конца. Я сделал несколько прототипов издевательства, где я заменяю вызовы БД с нитью. И совсем не параллельно.

То, что я боюсь, это положил слишком много нагрузки на SQL Server ... Есть ли какие-либо соображения, которые я должен рассмотреть, прежде чем идти слишком далеко по этому пути?

Это было полезно?

Решение

Другой вариант будет создать конвейер, так что шаг 3 для второй группы, происходящего одновременно как шаг 4 для первой группы. И если вы можете перекрывать обновления на шаге 5, сделайте это тоже. Таким образом, вы делаете одновременный доступ к SQL и обработку, но не налогом налогов базу данных, потому что у вас есть только две одновременные операции.

Таким образом, вы делаете шаги 1 и 2 последовательно (я предполагаю), чтобы получить коллекцию групп, которые требуют дальнейшей обработки. Затем. Ваша главная тема начинается:

for each group
  query the database
  place the results of the query into the calc queue

Службы второго потока Результаты очереди:

while not end of data
  Dequeue result from calc queue
  Do numeric calculations
  place the results of the query into the update queue

Третий поток сервисы Очередь обновления:

while not end of data
  Dequeue result from update queue
  Update database

То System.Collections.Concurrent.BlockingCollection<T> очень эффективная очередь для такого рода вещей.

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

Я использую что-то очень похожее на это в ежедневной программе Merge / Update, с очень хорошими результатами. Этот конкретный процесс не использует SQL Server, а скорее стандартный файл ввода / вывода, но концепции переводится очень хорошо.

Другие советы

Если параллельная версия намного быстрее, чем последовательная версия, я бы не беспокоился о штамме на вашем SQL Server ... Если, конечно, задачи, которые вы выполняете, являются низкими приоритетами по сравнению с некоторыми другими значительными или критическими вариантами времени, которые также являются выполняется на сервере БД.

Ваше описание задач не совсем понятно, но это почти звучит как больше этих задач, которые должны были быть выполнены непосредственно в базе данных (я предполагаю, что есть детали, которые делают это не возможно?)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top