快速合并多个大型 csv 文件

Merge multiple large csv files quickly

我有多个大型 csv 文件。每个文件的大小为 1 GB 到 7 GB。

我所有的文件都没有headers。它是这种格式。 ID,col1,col2,col3

文件 1 具有此结构。

1,23,22,27
2,67,29,22
3,34,34,23

文件 2 具有此结构。

4,23,22,27
5,67,29,22
6,34,34,23

即该 ID 在所有文件中都是唯一的。

我想将这些文件合并到一个 csv 文件中,然后根据 ID 列对行进行排序。生成的文件将约为 75 GB。它以 ID 1.

开头
1,23,22,27
2,67,29,22
3,34,34,23
4,23,22,27
5,67,29,22
6,34,34,23

目前我就是这样做的

import pandas as pd

CHUNK_SIZE = 10000000 # Number of Rows
output_file = 'combined.csv'

for csv_file_name in sorted_fnames:
    chunk_container = pd.read_csv(csv_file_name, chunksize=CHUNK_SIZE)
    print(csv_file_name)
    for chunk in chunk_container:
        chunk.to_csv(output_file, mode="a", index=False)   

然后我像这样对文件进行排序。

sort --parallel=2 -t, -k1,1 -n combined.csv > combined_sorted.csv

但是,合并过程非常缓慢。合并文件需要一个多小时。

注意:我只有 16 GB 内存。这就是我使用分块选项的原因。

有没有最快的解决方案?

谢谢

转念一想,您可以使用 hdf5 能够很好地处理大数据的结构:

import pandas as pd

hdf_path = '_combined.h5'

with pd.HDFStore(hdf_path, mode='w', complevel=5, complib='blosc') as store:
    for csv_file_name in sorted_fnames:
        store.append('data', pd.read_csv(csv_file_name), index=False)

如果你愿意,你最终可以将它保存回 csv,但使用 hdf5 会更有效

找到了一个快速的解决方案。文件在几分钟而不是几小时内处理。

以下假设您在所有 csv 文件中都没有 header 行。如果你有 header 行,你需要先删除它。 [注意:如果第一个 csv 文件中只有 header 行,则无需修复]

import subprocess
sorted_fnames = ["1.csv",
                 "2.csv",
                 "3.csv"]

my_cmd = ['cat'] + sorted_fnames
with open('combined.csv', "w") as outfile:
    subprocess.run(my_cmd, stdout=outfile)

如果要排序,可以使用排序命令。

sort --parallel=2 -t, -k1,1 -n combined.csv > combined_sorted.csv

如果这不是您所需要的:

$ cat file1 file2
1,23,22,27
2,67,29,22
3,34,34,23
4,23,22,27
5,67,29,22
6,34,34,23

然后编辑您的问题以提供更有用的示例 input/output 真实地展示您的要求以及上述内容不适用的地方。