You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 20:36:03