我想先将流写入箭头文件,然后再将其读回熊猫数据帧,尽可能少的内存开销。
批量写入数据效果很好:
import pyarrow as pa
import pandas as pd
import random
data = [pa.array([random.randint(0, 1000)]), pa.array(['B']), pa.array(['C'])]
columns = ['A','B','C']
batch = pa.RecordBatch.from_arrays(data, columns)
with pa.OSFile('test.arrow', 'wb') as f:
with pa.RecordBatchStreamWriter(f, batch.schema) as writer:
for i in range(1000 * 1000):
data = [pa.array([random.randint(0, 1000)]), pa.array(['B']), pa.array(['C'])]
batch = pa.RecordBatch.from_arrays(data, columns)
writer.write_batch(batch)
如上所述写入 100 万行速度很快,并且在整个写入过程中使用大约 40MB 内存。这很好。
但是,在生成大约 118MB 的最终数据帧之前,由于内存消耗高达 2GB,因此回读并不好。
我试过这个:
with pa.input_stream('test.arrow') as f:
reader = pa.BufferReader(f.read())
table = pa.ipc.open_stream(reader).read_all()
df1 = table.to_pandas(split_blocks=True, self_destruct=True)
而这个,具有相同的内存开销:
with open('test.arrow', 'rb') as f:
df1 = pa.ipc.open_stream(f).read_pandas()
数据框大小:
print(df1.info(memory_usage='deep'))
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 A 1000000 non-null int64
1 B 1000000 non-null object
2 C 1000000 non-null object
dtypes: int64(1), object(2)
memory usage: 118.3 MB
None
我需要的是使用 pyarrow 修复内存使用情况,或者建议我可以使用哪种其他格式来增量写入数据,然后将所有数据读入 pandas 数据帧,而不会产生太多内存开销。