python - 加载数据时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 毫秒。
什么没有区别:
- 无论我是在 Jupyter Notebook 还是从独立脚本中运行它
- 我是否重新启动 Python 3 内核
- 我是否使用
.sel(..., method='nearest')
或提供准确的经度/纬度坐标
我在这里有点难过。在操作系统级别上正在缓存某些东西?我该如何优化这段代码,因为我要做很多这样的事情?我应该使用分块吗?
解决方案
推荐阅读
- javascript - 如何将 JSON 放入 JavaScript 对象数组?
- r - 在 R 中绘制二进制列总和,然后用分类变量的比率覆盖这些列
- python - 问题 ModuleNotFoundError:没有名为“torch._C”的模块
- docker - 在 docker 容器中进行 dotnet 还原期间出现错误
- javascript - “Firefox:当前不支持事件页面”的解决方法。
- excel - Excel VBA 公式名称管理器自动更新源数据
- python - 我们如何用python中的平均值替换数据集中的空单元格
- java - 在 Eclipse 中设置 JavaFX 自包含构建时遇到问题
- amazon-web-services - AWS QuickSight 可以同时使用 Active Directory 和 IAM 登录吗?
- java - 调用 init 方法失败;嵌套异常是 org.hibernate.AnnotationException: No identifier specified for entity