如何用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
相关产品推荐
相关产品推荐

