MPI Scatter для распространения большого CSV-файла

У меня большой CSV-файл, и мне нужно обработать каждую строку, чтобы подсчитать несколько слов. Мне нужно использовать некоторый подход MPI для распределения обработки данных между несколькими процессами. В настоящее время я использую Scatter/ собрать в 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)

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам