我正在使用DASK读取大小约为2GB的CSV文件。我想写它的每一行,根据一些哈希函数分离255个数字的CSV文件,如下所示。
from dask import dataframe as dd
if __name__ == '__main__':
df = dd.read_csv('train.csv', header=None, dtype='str')
df = df.fillna()
for _, line in df.iterrows():
number = hash(line[2]) % 256
with open("{}.csv".format(number), 'a+') as f:
f.write(', '.join(line))
这种方式大约需要15分钟。我们有什么方法可以更快地做到这一点。
由于您的过程由IO主导,因此除非您的散列函数真的很慢,否则Dask在这种情况下除了增加开销之外什么都不太可能。我认为情况并非如此。
@zwer的解决方案看起来像
files = [open("{}.csv".format(number), 'a+') for number in range(255)]
for _, line in df.iterrows():
number = hash(line[2]) % 256
files[number].write(', '.join(line))
[f.close() for f in files]
但是,您的数据似乎适合内存,因此您可能会发现更好的性能
for (number, group) in df.groupby(df.iloc[:, 2].map(hash)):
group.to_csv("{}.csv".format(number))
因为你连续写入每个文件而不是在它们之间跳转。根据您的IO设备和缓冲,差异可以是无或巨大。