Разброс MPI для распространения большого файла csv

У меня есть большой CSV-файл, и мне нужно обработать каждую строку, чтобы подсчитать несколько слов. Мне нужно использовать некоторый подход MPI для распределения обработки данных между несколькими процессами. В настоящее время я использую scatter/gather в mpi4py библиотеке. Проблема в том, что мне нужно создать массив с длиной, равной количеству процессов. Но я получаю ошибку памяти при создании списка для большого количества строк.

size = comm.Get_size()
f=open('x.csv')
lines=[[] for _ in range(size)]
for line in f:
    # this line raises memory error after about 250000 rows are appended
    lines[i%size].append(line)

Есть ли другой способ передачи больших данных между этими процессами?


person stardiv    schedule 02.04.2016    source источник
comment
1) Это работает на нескольких узлах? 2) Это общая файловая система? Как правило, очень маловероятно, что вы на самом деле повышаете производительность благодаря своему подходу, а не последовательному подсчету ваших слов, поскольку это, вероятно, ограничено пропускной способностью дискового ввода-вывода, а не вычислениями.   -  person Zulan    schedule 02.04.2016
comment
@Zulan да, у меня есть несколько узлов и общая файловая система. в настоящее время производительность для меня не так важна, я просто хочу протестировать и поработать с этой библиотекой MPI в моем файле   -  person stardiv    schedule 02.04.2016


Ответы (1)


В основном у вас есть следующие варианты:

  1. Обрабатывайте данные фрагментами, например. прочитать 200к строк, разбросать, собрать результаты, повторить.
  2. Считайте данные локально, например. 1/size файла на каждом ранге. Это может быть трудно сделать эффективно. Вы не можете эффективно искать определенную строку в файле csv. Таким образом, вы должны разделить файл по размеру, seek до позиции, где вы его разделили, найти следующую новую строку и работать оттуда до первой новой строки после конца вашей части файла.
  3. Объедините оба.

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

P.S. Рассмотрим модуль csv.

person Zulan    schedule 02.04.2016