首页 > 解决方案 > 加载数据时xarray奇怪的性能问题

问题描述

我正在使用 netCDF 文件中提供的气候变量进行数据分析任务,并希望用于xarray加载和处理数据。我有每个变量的每小时网格数据的月度文件,命名约定有点像:

{prefix}_{variablename}_YYYY_MM.nc

每个文件约为 1.5 GB,由三个坐标索引:时间(30 天一个月的 720 个值)、纬度 (721)、经度 (1440)。我在特定网格单元(由兴趣点的 lon/lat 指定)处提取变量值,计算一个月的平均值,最后要计算月平均值的长期平均值(例如 30 年)。

我尝试了几件事。分组平均只在xarray.open_mfdataset()那里坐了一个小时。所以我决定从每个文件中提取变量的平均值,将它们填充到一个列表中,然后将列表转换为数据框,以便稍后再进行分组和平均。

这效果更好,但我在数据提取的性能方面遇到了一些问题。主循环,每个循环的时间代码如下所示,变量为雪深度sd

output = []
for yr in range(startyr, endyr+1):
    for mth in range(1, 13):
        start = time.time()
        fp = datadirpath / f"{prefix}_sd_{yr}_{str(mth).zfill(2)}.nc"
        with xr.open_dataset(fp) as src:
            one_month_snow = src['sd'].sel(
                latitude=lat, longitude=lon, 
                method='nearest')
            output.append([yr, mth, one_month_snow.mean().values.item()])
        stop = time.time()
        print(stop - start)

每次迭代大约需要 22 秒。这似乎很长。但非常奇怪的是,如果我重新运行完全相同的代码,每次迭代只需要 <10 毫秒。

什么没有区别:

我在这里有点难过。在操作系统级别上正在缓存某些东西?我该如何优化这段代码,因为我要做很多这样的事情?我应该使用分块吗?

标签: pythonnetcdfpython-xarray

解决方案


推荐阅读