Параллельный подход для обработки больших пакетов данных с использованием большого количества дисковых операций ввода-вывода - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть задача, где мне нужно сделать следующее

for fi in files, do in parallel:
  for job in jobs, do serially:
    read fi into memory from disk
    do job(fi), save output to disk

(Особенности задачи делают нецелесообразным распараллеливание внутреннего цикла.)

Есть тысячи files и около 400 jobs. Прямо сейчас files - это набор .csvs, и я сохраняю вывод в кучу csv в другом месте. входные csvs около 30 МБ, выходные данные около 10 МБ

Что мне действительно нужно, так это база данных, но базы данных, о которых я знаю, не могут обрабатывать параллельный ввод-вывод. Так что я просто читаю и сохраняю кучу CSV. Я знаю, что ОС также не может выполнять параллельный ввод-вывод, но она обрабатывает параллельные запросы лучше, чем базы данных, о которых я знаю.

Итак, как лучше это сделать? Я нахожусь на AWS, и сейчас все сидит на томе EBS. Могу ли я ожидать более высокой производительности, передавая все входные данные до корзины S3, загружая их по мере необходимости и загружая выходные данные (файлы составляют пару МБ каждый)?

Или есть какая-то параллельная архитектура базы данных ввода-вывода, которая живет где-то в облаке, о которой я могу узнать, а затем арендовать?

Предложения о том, как подойти к этому, приветствуются.

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Ваш job требует большого количества вычислений. Поэтому, если вы уже достигли 100% загрузки ЦП, я сомневаюсь, что может быть улучшение путем распараллеливания операций чтения.

Для улучшения вашего текущего решения можно сделать две вещи:

  1. Используйте твердотельные накопители, чтобы довести время ввода-вывода до минимума, если вы этого еще не сделали;
  2. Разделите свою задачу, чтобы вы могли использовать более одной машины. Если вы достигли 100% загрузки ЦП и хотите работать еще быстрее, вам явно нужно больше ядер для выполнения задачи.
0 голосов
/ 09 ноября 2018

Я думаю, вы делаете больше операций ввода-вывода, чем нужно.У вас есть:

for fi in files, do in parallel:
  for job in jobs, do serially:
    read fi into memory from disk
    do job(fi), save output to disk

Если у вас есть возможность создать поток памяти, вы можете сделать это:

for fi in files, do in parallel:
  read fi into memory and create memory stream ms
  for job in jobs, do serially:
    do job(ms), save output to disk

Это предполагает, конечно, что вы делаете копиюфайла, который вы читаете с диска, вместо того, чтобы изменять его на месте.

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

0 голосов
/ 08 ноября 2018

30 МБ - ничто для современных систем. Так что я думаю, что ваше узкое место - это работа, а не IO. Вам нужно подтвердить предположение, но похоже, что улучшение ввода-вывода - пустая трата времени.

Чтобы уменьшить размер файла и сложность вычислений, вы можете просто использовать собственный двоичный формат. Размер файлов будет меньше, их чтение займет меньше времени, поскольку нам не нужно преобразовывать строки в числа и наоборот.

Просто идея ...

...