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