DASK - 读取巨大的CSV并写入255个不同的CSV文件

问题描述 投票:0回答:1

我正在使用DASK读取大小约为2GB的CSV文件。我想写它的每一行,根据一些哈希函数分离255个数字的CSV文件,如下所示。

My naive solution:

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分钟。我们有什么方法可以更快地做到这一点。

python csv dask
1个回答
2
投票

由于您的过程由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设备和缓冲,差异可以是无或巨大。

© www.soinside.com 2019 - 2024. All rights reserved.