pandas - 有没有更快的方法使用 pandas 连接巨大的数据帧(40GB)

标签 pandas performance memory concatenation

我有 3 个 40 GB 大小的巨大数据帧,我使用 block 打开它们。然后,我想将它们连接在一起。这是我尝试过的:

    path = 'path/to/myfiles'
    files = [os.path.join(path,i) for i in os.listdir(path) if i.endswith('tsv')]
    for file in files:
        cols = ['col1','col2','col3']
        chunks = pd.read_table(file, sep='\t', names=cols, chunksize=10000000)

但是,当我尝试连接所有文件时,它花费了很长时间。 我想要一些建议来更快/更快地连接所有数据帧。

最佳答案

  1. CSV/TSV 是一种非常慢的文件格式,未经优化。
  2. 您可能不需要将整个数据集保留在内存中。您的用例可能不需要对整个组合 (120GB) 数据集进行完全随机的列和行访问
  • (您可以连续处理每一行/ block /组(例如邮政编码、用户 ID 等)吗?例如计算聚合、汇总统计数据、特征?或者您是否需要能够跨列应用任意过滤器(哪些列),或行(哪些列)?例如“获取过去 N 天内使用过服务 X 的所有用户 ID”。您可以根据您的用例选择更高性能的文件格式。有替代文件格式(HDFS、PARQUET 等)有些针对列访问或行访问进行了优化,有些则针对顺序或随机访问进行了优化。还有 PySpark。
  • 您不一定需要将数据集合并到一个巨大的 120GB 整体文件中。
  1. 您说运行时很慢,但很可能您耗尽了内存(在这种情况下,运行时就会消失),因此您首先要检查内存使用情况。
  • 您的代码正在尝试读入并存储每个文件的所有 block ,而不是跨三个文件逐 block 处理它们:对于文件中的文件:... chunks = pd.read_table(file, ... chunksize=10000000)。请参阅Iterating through files chunk by chunk, in pandas .
  • 修复此问题后,chunksize=1e7 参数不是内存块的大小;它只是 block 中的行数。这个值实在是太大了。如果组合数据帧的一行需要 10Kb,那么 1e7 个这样的行的 block 将需要 100Gb(!),这不适用于大多数机器。
  1. 如果您必须坚持使用 CSV,在三个文件中分别处理一个 block ,然后将其输出写入文件,不要将所有 block 留在内存中。另外减少你的 block 大小(尝试例如 1e5 或更少,并测量内存和运行时的改进)。也不要对其进行硬编码,找出每台机器的合理值,和/或将其设为命令行参数。监控您的内存使用情况。

关于pandas - 有没有更快的方法使用 pandas 连接巨大的数据帧(40GB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58840390/

相关文章:

Python:尝试交叉应用两个数据框

c# - 什么 VS 调试器使增量运算符执行得比什么都不做更快?

oracle - 使用唯一约束来实现更简单的连接

c++ - 在销毁对象之前锁定对象的互斥体将释放内存或其他一些意外的

c - 如何在程序集级别写入具有负偏移量的文件?

python - Pandas :从去年的同一天获取前一年的值(value)

python-3.x - 使用模拟获取应用的函数输入数据框

python - 使用时间序列索引替换 pandas 列值

performance - 运行多个 Docker 虚拟机的服务器将如何处理 TCP 限制?

Java 在 VPS 上内存不足