PyArrow: постепенное использование ParquetWriter без сохранения всего набора данных в памяти (больше, чем файлы паркетов в памяти)

Пытаюсь записать на диск большой паркетный файл (больше памяти). Я наивно думал, что могу быть умным и использовать 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
                    )
                )

Но даже несмотря на то, что я получаю фрагменты (например, 10 000 строк в моем случае) и использую write_table, он по-прежнему сохраняет весь набор данных в памяти.

Оказывается, ParquetWriter хранит весь набор данных в памяти , а записывает на диск постепенно.

Есть ли способ заставить ParquetWriter не хранить весь набор данных в памяти, или это просто невозможно по уважительным причинам?


person Niklas B    schedule 14.09.2020    source источник
comment
Связанный вопрос: stackoverflow.com/questions/68375254 /   -  person Mikko Ohtamaa    schedule 14.07.2021


Ответы (1)


Согласно анализу из отчета об ошибке со стрелкой, это может быть вызвано сбором метаданных. который может быть сброшен только при закрытии файла.

person Micah Kornfield    schedule 21.10.2020