Дизайн потока данных TPL для асинхронной конвейерной обработки 4 блоков

Это новый вопрос относительно TPL Dataflow ProducerConsumer Pattern, на который уже ответил Свик.

  1. Мне нужно обрабатывать 4 файла по 2 ГБ параллельно, и мне нужно прочитать буфер содержимого файла по буферу. (Здесь используется шаблон производителя. С Maxdegreeofparallelism = 4 я могу размещать 4 буфера за раз)
  2. Необходимо обработать буфер и записать в промежуточную таблицу. (Здесь используется потребительский паттерн.)
  3. Таблицы данных в памяти должны быть преобразованы в соответствии с бизнес-правилами и записаны в нормализованные таблицы.
  4. Данные в памяти снова используются повторно для еще нескольких проверок окончательной версии данных.

В настоящее время 3-й и 4-й шаги не используют никаких блоков. Это через последовательные вызовы функций от потребителя.

  1. Это правильный дизайн?
  2. Есть ли способ конвейеризации 4 блоков один за другим и параллельной обработки всех, кроме подхода производителя-потребителя? Не могли бы вы помочь мне с небольшим примером кода для этого?

person user1884330    schedule 29.01.2013    source источник
comment
Вам нужно обработать только 4 файла? Почему вы выбрали модель потребителя производителя?   -  person paparazzo    schedule 29.01.2013
comment
За один раз мне может понадобиться обработать от 4 до 8 файлов. Я могу получать дополнительные файлы через определенные промежутки времени каждый день. Шаблон «производитель-потребитель» используется в основном для постановки в очередь и обработки буфера записей из файла.   -  person user1884330    schedule 30.01.2013
comment
Зачем ставить записи в очередь, а не обрабатывать их на параллельном шаге 1?   -  person paparazzo    schedule 30.01.2013
comment
@ Бальзам - Возьмите по одному файловому процессу за раз. Чтение 50 записей в буфер и передача на обработку и преобразование. Обработка и преобразование займут больше времени, чем чтение. Я пытаюсь ввести здесь параллелизм на каждом этапе. Использование bufferblock для параллельного чтения n-го буфера записей и асинхронной отправки в блок действий для обработки и преобразования со степенью параллелизма n. Ваши ценные предложения приветствуются.   -  person user1884330    schedule 31.01.2013
comment
Хорошо, я просто не подозревал, что запись в промежуточную таблицу займет больше времени. Что это за промежуточный стол? Если вы используете DataTables, посмотрите на это - они медленные!   -  person paparazzo    schedule 31.01.2013
comment
Обработка и преобразование включают в себя некоторые вычисления, и все они выполняются для набора данных и его таблицы данных. Как я могу здесь улучшить производительность? Естественно, вычисления и другие операции с наборами данных задерживают обработку по сравнению с чтением. Возвращаясь к исходному вопросу. Этот дизайн хорош? или есть лучший дизайн для этого?   -  person user1884330    schedule 31.01.2013


Ответы (1)


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

Если вы хотите создать конвейер в TDF, обычно используйте несколько IPropagatorBlock < / a>, скорее всего, TransformBlock.

TransformBlock работает, если вы производите одиночный вывод для каждого ввода блока. Но похоже, что в вашем случае это не так, поэтому вы можете использовать TransformManyBlock, который может выдавать любое количество выходных данных для каждого входа (включая 0 или 1).

Другой вариант - напрямую Post() (или await SendAsync()) к следующему блоку при создании вывода.

person svick    schedule 29.01.2013
comment
Подробные требования приведены здесь: stackoverflow.com/questions/13756717/ - person user1884330; 30.01.2013
comment
Не могли бы вы предоставить для этого образец кода? В противном случае любые полезные ссылки также прекрасны. - person user1884330; 30.01.2013
comment
@ user1884330 Я считаю, что в учебнике по TDF будет пример использования TransformBlock. Вы смотрели на некоторые из них? - person svick; 30.01.2013