以节省内存的方式从 python 中的流创建 Parquet 文件

Posted

技术标签:

【中文标题】以节省内存的方式从 python 中的流创建 Parquet 文件【英文标题】:Create Parquet files from stream in python in memory-efficient manner 【发布时间】:2021-02-23 17:29:14 【问题描述】:

在 Python 中创建 Parquet 文件的最常见方法似乎是首先创建一个 Pandas 数据框,然后使用 pyarrow 将表写入 Parquet。我担心这可能会过度占用内存 - 因为它需要至少将数据集的一个完整副本存储在内存中才能创建 pandas 数据框。

我想知道是否由于列压缩要求而需要将整个数据集加载到内存中,或者是否有更高效且基于流的方法。就我而言,我将以流媒体方式接收记录。对于类似的 csv 输出过程,我们以 1000 行为单位将行写入磁盘,因此需要保存在内存中的行数永远不会达到完整数据集的大小。

我应该……吗?:

    只需创建一个 pandas 数据框,然后将其写入 parquet。 (这意味着整个数据集都需要存储在内存中,但我们将其视为必要要求。) 当我们收到它们时,使用一些流友好的方式一次写入大约 1000 行,从而最大限度地减少整个过程中的时间点 RAM 消耗总量。 (我没有看到任何有关如何执行此操作的文档,我不确定它是否可以用于镶木地板。) 将所有内容写入 CSV,然后使用智能读取/分析 CSV 内容并在事后创建压缩镶木地板的功能。 (运行时间可能会更慢,但内存配置文件会更低,并且在处理非常大的文件时失败的可能性也会更低。)

想法? 有什么建议吗?

【问题讨论】:

【参考方案1】:

您需要 Parquet 中的行组。请参阅here 以了解它们是什么,但简短的版本是列式数据仅限于多行的块,并且每个块可以单独附加到文件中。您可以使用PyArrow 为传入数据流实现此功能。

【讨论】:

以上是关于以节省内存的方式从 python 中的流创建 Parquet 文件的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 以编程方式创建视图时的 Lazy Var vs. Let(节省内存)

python 逐步写入`npz`文件以节省内存

以节省内存的方式增长 data.frame

理解Java之IO流

字节流 字符流 - 12

JAVA学习之字节流字符流