2016-04-02 3 views
2

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

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) 

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

+1

1) Выполняется ли это на нескольких узлах? 2) Является ли это общей файловой системой? Вообще кажется ** очень маловероятным **, что вы на самом деле получаете производительность от своего подхода, а не поочередно подсчитываете свои слова, так как это, вероятно, ограничено шириной запрета ввода-вывода, а не вычислением. – Zulan

+0

@ Zulan Да, у меня есть несколько узлов и общая файловая система. в настоящее время производительность для меня не так важна, я просто хочу протестировать и работать с этой библиотекой MPI в своем файле – stardiv

ответ

1

Вы Bascially имеют следующие параметры:

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

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

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