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

如何用Polars并行读取.csv.xz格式的压缩CSV文件?

用Polars并行读取.csv.xz压缩文件的方案

我有一批.csv.xz格式的压缩CSV文件,希望能并行读取它们。我已掌握通过生成器表达式顺序读取并合并的方法,代码如下:

import glob
import lzma
import polars as pl

the_path = 'paths/to/my/*.csv.xz'
all_dfs = pl.concat(
    (pl.read_csv(lzma.open(i)) for i in sorted(glob(the_path))), 
    how='vertical')

但我了解到Polars可能支持并行读取的功能,查看官方文档及pl.scan_csv的方法签名后,发现它似乎仅支持Path或List[Path]类型的输入,且Polars目前暂不支持自动推断压缩格式(不同于pd.read_csv可直接读取file.csv.xz)。这是否意味着无法用Polars并行处理压缩CSV?另外,不借助joblib或concurrent.futures这类工具,是否还有其他实现并行IO的方式?


回答

1. 原生Polars并行方案(无需额外工具)

Polars本身支持多文件并行读取,只需手动指定压缩格式即可,不需要依赖第三方并行库。核心是用scan_csv的lazy模式结合批量文件路径处理:

import glob
import polars as pl

the_path = 'paths/to/my/*.csv.xz'
file_paths = sorted(glob.glob(the_path))

# 批量创建lazy frame,指定xz压缩格式
lazy_dfs = [pl.scan_csv(path, compression='xz') for path in file_paths]
# 并行合并并执行计算
all_dfs = pl.concat(lazy_dfs, how='vertical').collect()

2. 方案原理说明

  • Polars的scan_csv对多文件的并行是跨文件的IO并行:它会同时调度读取多个不同的压缩文件,充分利用多核资源提升整体读取速度。
  • 虽然Polars不能自动识别.csv.xz的压缩格式,但手动设置compression='xz'即可解决该问题,无需用lzma.open打开文件对象(这种方式会让Polars无法启动并行调度)。

3. 与顺序读取方案的差异

你原来的生成器表达式是逐个顺序读取文件,而上述lazy方案由Polars内部调度并行读取多文件,在文件数量较多时,速度提升明显,且代码更简洁。


内容的提问来源于stack exchange,提问作者ifly6

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 14:38:13