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 ответ
Решение
У вас есть следующие варианты:
- Обработайте данные порциями, например, прочитайте 200 тыс. Строк, разбросайте, соберите результаты, повторите.
- Читайте данные локально, например
1/size
файла на каждый ранг. Это может быть трудно сделать эффективно. Вы не можете эффективно искать определенную строку в CSV-файле. Таким образом, вы должны разделить файл по размеру,seek
до места, где вы его разбили, найдите следующую новую строку и продолжайте работать до первой новой строки после конца вашей части файла. - Объедините оба.
Но опять же, вы можете просто обрабатывать файл последовательно, построчно, отбрасывая каждую строку после того, как посчитаете слова этого слова.
PS Рассмотрим csv
модуль.