首页 > 解决方案 > 多个块同时处理大数据

问题描述

我正在尝试使用块连接并处理两个非常大(> 800GiB)的文件。

文件看起来像:

文件 1

1 1 0.5
1 2 0.2
2 2 0.4
2 3 0.2...

文件2

1 1 0.6
1 2 0.3
2 2 0.6
2 3 0.7...

我想要的结果是文件:

1 2 0.2 0.3
2 3 0.2 0.7...

我尝试了不同的块代码,但找不到以下选项:从两者中读取 5000 条记录,继续,保存到文件,然后从两者中开始下一个 5000 条。

大约。代码:

mode="w"
file1=pd.read_csv('test1.csv', delim_whitespace=True,header=None,chunksize=5000)
file2=pd.read_csv('test2.csv', delim_whitespace=True,header=None,chunksize=5000)
for chunk in file1:
   for chunk1 in file2:
     un_file1=chunk[chunk[0]!=chunk[1]]
     un_file2=chunk1[chunk1[0]!=chunk1[1]]
     conc=pd.concat([un_file2,un_file2[2]],axis=1)
     conc.to_csv(r'test_test.csv', header=False,index=False, sep=" ",mode=mode)
     mode="a"

因此,在当前代码中,文件 2 中的所有块连接到文件 1 的第一个块 =(

标签: pandasdataframechunks

解决方案


这是一种从每个文件中迭代读取一个块,然后合并它们的方法:

df1 = pd.read_csv('test1.csv', chunksize=1000)
df2 = pd.read_csv('test2.csv', chunksize=1000)

while True:
    try:
        df1c = next(df1)
        df2c = next(df2)

        df1c = df1c[df1c['0'] != df1c['1']]
        df2c = df2c[df2c['0'] != df2c['1']]

        df1c.merge(df2c, on=['0', '1']).to_csv(
            'test3.csv', header=False, index=False, mode='a')

    except StopIteration:
        break

尽管使用这种大小的文件,它仍然可能需要一段时间。


推荐阅读