快速合并多个大型 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 真实地展示您的要求以及上述内容不适用的地方。
我有多个大型 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 真实地展示您的要求以及上述内容不适用的地方。