MPI 分散分布大型 csv 文件
MPI scatter to distribute large csv file
我有一个很大的 csv 文件,我需要处理每一行以计算一些单词。我需要使用一些 MPI 方法在多个进程之间分配数据处理。目前,我在 mpi4py
库中使用 scatter/gather。问题是我需要创建一个长度等于进程数的数组。但是在为大行数创建列表时出现内存错误。
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)
还有其他方法可以在这些进程之间传输大数据吗?
您基本上有以下选择:
- 以块的形式处理数据,例如读取 200k 行,分散,收集结果,重复。
- 在本地读取数据,例如
1/size
每个等级的文件。这可能很难有效地做到。您无法有效地查找 csv 文件中的特定行。所以你必须按大小分隔文件,seek
到你 split 的位置,找到下一个换行符并从那里开始工作,直到你的文件结束后的第一个换行符文件的一部分。
- 两者结合。
但话又说回来,您可以逐行连续处理文件,在计算完文件的字数后丢弃每一行。
P.S。考虑 csv
模块。
我有一个很大的 csv 文件,我需要处理每一行以计算一些单词。我需要使用一些 MPI 方法在多个进程之间分配数据处理。目前,我在 mpi4py
库中使用 scatter/gather。问题是我需要创建一个长度等于进程数的数组。但是在为大行数创建列表时出现内存错误。
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)
还有其他方法可以在这些进程之间传输大数据吗?
您基本上有以下选择:
- 以块的形式处理数据,例如读取 200k 行,分散,收集结果,重复。
- 在本地读取数据,例如
1/size
每个等级的文件。这可能很难有效地做到。您无法有效地查找 csv 文件中的特定行。所以你必须按大小分隔文件,seek
到你 split 的位置,找到下一个换行符并从那里开始工作,直到你的文件结束后的第一个换行符文件的一部分。 - 两者结合。
但话又说回来,您可以逐行连续处理文件,在计算完文件的字数后丢弃每一行。
P.S。考虑 csv
模块。