许多巨大的csv文件的高效合并

Sto*_*aft 4 python merge python-itertools large-files pandas

我有一个脚本,它获取目录中的所有 csv 文件并使用外部联接将它们并排合并。问题是当我尝试在我需要加入的文件上使用它时,我的计算机窒息(MemoryError)(大约两打文件,每个 6-12 Gb)。我知道 itertools 可用于提高循环效率,但我不清楚它是否或如何应用于这种情况。我能想到的另一种选择是安装 mySQL,学习基础知识,然后在那里执行此操作。显然,如果可能的话,我宁愿在 Python 中执行此操作,因为我已经在学习它。基于 R 的解决方案也是可以接受的。

这是我的代码:

import os
import glob
import pandas as pd
os.chdir("\\path\\containing\\files")

files = glob.glob("*.csv")
sdf = pd.read_csv(files[0], sep=',')

for filename in files[1:]:
    df = pd.read_csv(filename, sep=',')
    sdf = pd.merge(sdf, df, how='outer', on=['Factor1', 'Factor2'])
Run Code Online (Sandbox Code Playgroud)

关于如何处理对于我的计算机内存来说太大的文件的任何建议将不胜感激。

Kar*_*tik 5

使用HDF5,我认为这将非常适合您的需求。它还处理核外查询,因此您不必面对MemoryError.

import os
import glob
import pandas as pd
os.chdir("\\path\\containing\\files")

files = glob.glob("*.csv")
hdf_path = 'my_concatenated_file.h5'

with pd.HDFStore(hdf_path, mode='w', complevel=5, complib='blosc') as store:
    # This compresses the final file by 5 using blosc. You can avoid that or
    # change it as per your needs.
    for filename in files:
        store.append('table_name', pd.read_csv(filename, sep=','), index=False)
    # Then create the indexes, if you need it
    store.create_table_index('table_name', columns=['Factor1', 'Factor2'], optlevel=9, kind='full')
Run Code Online (Sandbox Code Playgroud)

  • 好,谢谢。最终结果将需要在 csv 中,但没有什么可以阻止我之后保存这样的,对吗?并且我需要放在一起的文件共享相同的列,由于同一目录中的不相关文件,我收到了该错误。所以看起来你的解决方案会奏效! (2认同)

归档时间:

查看次数:

7475 次

最近记录:

9 年,4 月 前