Pyarrow Write/Append 列箭头文件

Pyarrow Write/Append Columns Arrow File

我有一个计算器可以迭代几百个对象并为每个对象生成 Nx1 数组。此处的 N 为 1-10m,具体取决于配置。现在我正在使用生成器表达式对这些进行求和,因此内存消耗很低。但是,我想将 Nx1 数组存储到文件中,这样我就可以进行其他计算。(计算分位数、部分和等 pandas 样式)最好我想在单个文件上使用 pa.memory_map (为了不将数据帧加载到内存中),但我看不出如何在不先生成整个结果的情况下生成这样的文件。 (Monte Carlo 在 200-500*10m 浮筒上的结果)。

如果我理解正确,RecordBatchStreamWriter 需要整个 table 的一部分,而我不能只生成其中的一部分。计算器产生的部分是列,而不是所有列的部分。有什么方法可以一一写“列”吗?通过附加或创建一个可以填充的空箭头文件? (架构已知)。

据我所知,我的替代方法是编写多个文件并使用“数据集”/表格数据将它们“连接”在一起。然后我的“其他计算”将不得不过滤或将部分提取到内存中,因为我在文档中看不到“数据集()”与 memory_map.The 一起使用结果集太大以适合内存。 (至少在服务器上是 运行)

我正在研究文档并试图了解它是如何工作的第 2 天,如果“行话”不完全正确,我们深表歉意。

经过进一步检查,似乎 datasets() 中使用的所有文件都必须具有相同的架构,所以我也不能将“列”拆分为单独的文件,我可以..

编辑 在与这个库搏斗之后,我现在生成单列文件,然后将它们合并到一个文件中。但是,按照建议的解决方案,在合并文件的步骤中可见内存消耗(任务管理器)猛增。我预计每个“行组”或组合记录批次都会达到峰值,但会稳步增加以使用所有内存。此步骤的一个片段:

    readers = [pa.ipc.open_stream(file) for file in self.tempfiles]
    combined_schema = pa.unify_schemas([r.schema for r in readers])
        with pa.ipc.new_stream(
            os.path.join(self.filepath, self.outfile_name + ".arrow"),
            schema=combined_schema,
        ) as writer:

            for group in zip(*readers):

                combined_batch = pa.RecordBatch.from_arrays(
                    [g.column(0) for g in group], names=combined_schema.names
                )

                writer.write_batch(combined_batch)

this link 我预计 运行 内存消耗将是 combined_batch 和一些。

您可以分两次完成写入。

  • 首先,将每一列写入其自己的文件。确保将行组大小设置得足够小,以使由每个文件的一个行组组成的 table 能够轻松地放入内存。
  • 其次,为您创建的每个文件和一个作者创建一个流 reader。从每个行中读取一个行组。通过组合所有部分列创建一个 table,并将 table 写给你的作者。重复,直到你用完所有 readers。

我不确定内存映射对您有多大帮助。