PyArrow:增量使用ParquetWriter而不将整个数据集保留在内存中大于内存Parquet文件

问题描述

我正在尝试将大型木地板文件写入磁盘(大于内存)。我天真地以为我会很聪明,可以使用ParquetWriter和write_table逐步写入文件,例如(POC):

import pyarrow as pa
import pyarrow.parquet as pq
import pickle
import time

arrow_schema = pickle.load(open('schema.pickle','rb'))
rows_dataframe = pickle.load(open('rows.pickle','rb'))

output_file = 'test.parq'

with pq.ParquetWriter(
                output_file,arrow_schema,compression='snappy',allow_truncated_timestamps=True,version='2.0',# Highest available schema
                data_page_version='2.0',# Highest available schema
        ) as writer:
            for rows_dataframe in function_that_yields_data()
                writer.write_table(
                    pa.Table.from_pydict(
                            rows_dataframe,arrow_schema
                    )
                )

但是,即使我产生了块(例如我的情况下为1万行)并使用write_table,它仍将整个数据集保留在内存中。

结果是ParquetWriter将整个数据集保留在内存中,同时将其逐步写入磁盘

反正有强迫ParquetWriter不将整个数据集保留在内存中的原因吗?或者仅仅是出于种种原因而不可能?

解决方法

根据Arrow bug report的分析,这可能是由元数据的收集引起的,这些元数据只能在文件关闭时才被刷新。