以内存高效的方式从 python 中的流创建 Parquet 文件

aar*_*ers 10 python parquet fastparquet pyarrow

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

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

我是不是该...?:

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

想法?建议?

afa*_*dge 1

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