python - 如何在 python 中以内存高效的方式加载和合并多个 .txt 文件?

标签 python pandas performance memory hpc

我正在尝试读取多个 (>1000) .txt 文件(平均约 700 MB,带分隔符的无 header CSV,没有逗号或其他分隔符)并将它们合并到一个 pandas 数据帧中(以便下一次运行分析在整个数据集上)。

我在 HPC 服务器上通过 SSH 运行此程序,我在该服务器上请求 50GB 内存、1 个节点、每个节点 1 个任务(这只是一个大胆的猜测,因为我以前从未这样做过)。

到目前为止,我的想法是这样的:

li = []

for filename in all_files:
    df = pd.read_csv(filename, sep=None, header=0, engine='python')
    li.append(df)

df = pd.concat(li, axis=0, ignore_index=True)

但几个小时后加载了大约。第 360 个文件进程被终止,我收到错误消息:

numpy.core._exceptions.MemoryError: Unable to allocate 1.11 GiB for an array with shape (10, 14921599) and data type float64

你知道如何更有效地加载和合并数据吗? (我假设只是请求更多 RAM 仍然不能让我完成整个 .txt 文件集!?)

另外,我想之后以“内存高效”的方式保存生成的数据帧,你知道最好的方式/格式(csv?)吗?

如有任何帮助,我们将不胜感激!

最佳答案

正如您所说,您有这么多文件并且需要如此多的内存,所以我建议像这样以附加模式(将数据附加到先前保存的数据)将所有文件加载并保存在一个文件中

for filename in all_files:
    df = pd.read_csv(filename, sep=None, header=0, engine='python')
    df.to_csv('./data.csv', header=None, index=None, mode='a')

将所有文件保存在单个文件中后,您现在可以像这样将单个文件作为数据帧读取:

df = pd.read_csv('./data.csv',header=None,index_col=False)

之后,如果您因为内存不足而无法阅读此文件,您可以使用这样的阅读器:

chunksize = 10 ** 6
with pd.read_csv('./data.csv',header=None,index_col=False, chunksize=chunksize) as reader:
    for chunk in reader:
        # Do What you want

关于python - 如何在 python 中以内存高效的方式加载和合并多个 .txt 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71100248/

相关文章:

python - 使用rest api从python应用程序创建Moodle用户

python - 日期时间对象不适用于 weekday()

Python:使用字典输出文本文件的模式

python-3.x - 根据特定条件生成带有填充的行 - pandas

sql - 在查询中使用 VARCHAR 列的大小是否重要

python - 如何在图像颜色为黑色时使用 Pillow 将 PNG 转换为 JPG?

python - 加速pandas groupby中的滚动总和计算

pandas - 如何获取pandas数据框中特定列的模式值的索引

c++ - ostream_iterator vs for each 循环效率

c - 文件系统性能