如何使用PyArrow实现CSV文件分块读取,类似Pandas的chunksize功能?
你之前使用read_csv的方案确实会将全量数据加载到内存生成完整Arrow Table,block_size只是控制内部解析的分片大小,不会实现流式迭代,达不到降低内存占用的效果。
PyArrow的CSV模块原生提供了流式读取接口open_csv,可以实现完全不依赖Pandas的分块读取,不会加载全量数据到内存。
基础流式分块读取(按字节分片,性能最优)
import pyarrow.csv as csv # 配置读取参数,block_size单位为字节,可按需调整 read_options = csv.ReadOptions( use_threads=True, block_size=16 * 1024 * 1024 # 示例设置单个块大小为16MB ) # 如需指定列类型避免推断错误,可配置ConvertOptions # convert_options = csv.ConvertOptions( # column_types={"id": pyarrow.int64(), "content": pyarrow.string()} # ) # open_csv返回流式读取器,不会全量加载数据 with csv.open_csv( "your_large_file.csv", read_options=read_options, # convert_options=convert_options ) as reader: for batch in reader: # batch为pyarrow.RecordBatch类型,兼容Table的所有API do_stuff(batch)
固定行数分块(和Pandas chunksize行为一致)
如果需要和Pandaschunksize一样按固定行数切分批次,可以搭配batches_to_batches方法调整批次大小:
import pyarrow.csv as csv from pyarrow import batches_to_batches with csv.open_csv("your_large_file.csv") as reader: # 调整为每个批次固定100行 for fixed_size_batch in batches_to_batches(reader, desired_batch_size=100): do_stuff(fixed_size_batch)
大CSV转Parquet的完整示例
如果你需要实现CSV转Parquet的场景,直接搭配ParquetWriter即可,全程内存占用仅和单块大小相关:
import pyarrow.csv as csv import pyarrow.parquet as pq with csv.open_csv("large_input.csv") as reader, pq.ParquetWriter("output.parquet", reader.schema) as writer: for batch in reader: writer.write_batch(batch)
内容的提问来源于stack exchange,提问作者alt-f4
相关产品推荐
相关产品推荐

