从压缩CSV读取DataFrames速度变慢?Polars与Pandas性能异常排查
问题分析与优化建议
一、先修正代码中的关键错误
你的Polars代码存在一个明显的逻辑错误:columns=dtypes_to_use.values() 是错误用法。columns 参数需要传入列名字符串列表,但你传入的是类型对象(如pl.Date),这会导致Polars忽略columns参数,读取CSV的全部90列后再筛选转换指定列——这会额外消耗大量IO和内存,直接拖慢处理速度。
修正这一行:
columns=dtypes_to_use.keys(),
二、性能骤降的排查方向
- 系统资源占用:检查今日CPU、内存、磁盘IO是否被其他进程占用(如后台备份、其他数据分析任务)。读取压缩文件+解析CSV对IO和CPU依赖极高,系统资源不足会直接导致耗时增加。
- 缓存失效:昨日处理后系统可能保留了磁盘缓存(文件系统缓存),今日缓存被清空,需要重新从磁盘读取原始压缩包,耗时自然上升。可以尝试重复运行今日任务,看第二次耗时是否回到昨日水平。
- 压缩包内容变化:确认今日的
master.zip是否和昨日一致——比如匹配到的CSV数量增加、单文件行数变多,或者文件压缩率变化(新增CSV压缩比更低,解压耗时更长)。 - 环境版本变化:检查Polars/Pandas、Python或相关依赖包是否在昨晚更新过,新版本可能引入性能波动,可回退到昨日版本测试。
三、Polars代码优化建议
除修正columns参数外,还可通过以下方式进一步提升性能:
- 使用PyArrow解析器:在
read_csv中添加use_pyarrow=True,PyArrow的CSV解析器处理大文件时通常比Polars默认解析器更快:pl.read_csv( zip_file.open(file_name), separator=';', dtypes=dtypes_to_use, columns=dtypes_to_use.keys(), use_pyarrow=True ) - 直接读取Zip内文件路径:Polars支持直接读取Zip归档内的文件,无需手动打开ZipFile,可利用PyArrow的优化:
# 替换zip_file.open(file_name)为以下路径格式 f"zip://data/master.zip/{file_name}" - 延迟加载与批量处理:若不需要立即得到所有DataFrame,可先收集
LazyFrame,最后统一执行,减少内存占用和中间开销:data_lazy = [] with ZipFile("data/master.zip") as zip_file: for file_name in zip_file.namelist(): if m := pattern.match(file_name): lf = pl.scan_csv( zip_file.open(file_name), separator=';', dtypes=dtypes_to_use, columns=dtypes_to_use.keys(), use_pyarrow=True ).with_columns( pl.lit(m.group(1)).alias('SectionName'), pl.lit(m.group(2)).alias('SectionId'), ) data_lazy.append(lf) # 最终需要时再转换为DataFrame列表 data = [lf.collect() for lf in data_lazy]
内容的提问来源于stack exchange,提问作者user21474411
相关产品推荐
相关产品推荐

