使用xarray和cfgrib提取Grib2数据速度过慢,如何优化代码?
代码优化方案
一、加载数据阶段优化
- 替换低效加载格式:将原始CSV转成
Parquet或Feather格式,后续加载时用pd.read_parquet()/pd.read_feather(),速度可提升10-100倍,仅需转换一次,后续复用高效格式。 - 并行批量加载:如果是多文件场景,弃用单文件循环加载,改用
dask.dataframe.read_csv()自动拆分任务利用多核并行加载。 - 按需加载列:加载时通过
usecols参数指定仅需的列,比如pd.read_csv('data.csv', usecols=['time', 'station', 'value']),减少内存占用与IO开销。
二、保存CSV阶段优化
- 避免增量写入:不要在循环中用
to_csv(mode='a')反复打开/关闭文件,先将所有数据整合为单个DataFrame,一次性调用to_csv()完成写入。 - 改用更快的写入工具:用
csv模块批量写入替代pandas默认逻辑,示例代码:
import csv with open('output.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerows(data_rows) # 一次性写入全量数据行
- 并行写入:数据量极大时,用
dask.dataframe.to_csv()自动拆分数据块并行保存,或用concurrent.futures实现多进程写入。
三、内存与计算优化
- 压缩数据类型:在精度允许的情况下,将数值列从
float64转成float32,字符串列转成category类型,时间列统一用datetime64,减少内存占用以加速计算与IO,示例:
df['value'] = df['value'].astype('float32') df['station'] = df['station'].astype('category')
- 减少内存拷贝:处理数据时优先使用链式操作,必要时用
inplace=True避免生成中间变量。 - 用专用气象数据工具:若原始数据是NetCDF等气象格式,直接用
xarray加载处理,其针对多维气象数据优化,效率远高于pandas;若必须输出CSV,再批量转成DataFrame导出。
四、硬件与环境优化
- 更换SSD存储:机械硬盘IO速度远低于SSD,更换后可大幅降低读写耗时。
- 升级内存:若内存不足导致频繁磁盘换页,会严重拖慢速度,升级内存让数据完全加载至内存处理。
内容的提问来源于stack exchange,提问作者William Jacondino
相关产品推荐
相关产品推荐

