加快 xarray 的 fillna
Speeding up xarray's fillna
我有一个相当大的 netCDF 文件 (~10 GB),其填充值为 -1.0
当我像这样使用 xarray 的 fillna 时:
hndl_nc = hndl_nc.fillna(0.0)
它很慢(~2 分钟),是否有其他运算符可能更快?或者,鉴于文件的大小,这是可以预期的?
速度约为 85MB/s,这是矢量化 NumPy/xarray 操作的典型性能范围。我认为你不太可能通过简单地使用另一个 built-in 操作来显着改进这一点。
您也许仍然可以通过一些实验来提高性能。要做的第一件事是分析和查看 CPU 使用情况以确定时间花在了哪里。
- 如果您 CPU 受限于 Python:尝试使用 Dask 来并行化操作,如果您还没有使用它的话
- 如果您 CPU 绑定在 netCDF/HDF5 进程中:这可能是使用 in-file zlib 压缩(速度非常慢)的 netCDF4 文件的症状。要么提前将你的数据加载到内存中(使用
.load()
),重写你的文件而不压缩,或者尝试使用 xarray v0.9.0 或更新版本(目前在候选版本中)与 Dask 分布式或 multi-processing.
- 如果您受 IO 限制,请考虑:
engine='scipy'
可以更快,如果你有 netCDF3 文件
- 切换到
scale_factor
/add_offset
以压缩 int16
中的数据,而不是更大的浮点类型
我有一个相当大的 netCDF 文件 (~10 GB),其填充值为 -1.0
当我像这样使用 xarray 的 fillna 时:
hndl_nc = hndl_nc.fillna(0.0)
它很慢(~2 分钟),是否有其他运算符可能更快?或者,鉴于文件的大小,这是可以预期的?
速度约为 85MB/s,这是矢量化 NumPy/xarray 操作的典型性能范围。我认为你不太可能通过简单地使用另一个 built-in 操作来显着改进这一点。
您也许仍然可以通过一些实验来提高性能。要做的第一件事是分析和查看 CPU 使用情况以确定时间花在了哪里。
- 如果您 CPU 受限于 Python:尝试使用 Dask 来并行化操作,如果您还没有使用它的话
- 如果您 CPU 绑定在 netCDF/HDF5 进程中:这可能是使用 in-file zlib 压缩(速度非常慢)的 netCDF4 文件的症状。要么提前将你的数据加载到内存中(使用
.load()
),重写你的文件而不压缩,或者尝试使用 xarray v0.9.0 或更新版本(目前在候选版本中)与 Dask 分布式或 multi-processing. - 如果您受 IO 限制,请考虑:
engine='scipy'
可以更快,如果你有 netCDF3 文件- 切换到
scale_factor
/add_offset
以压缩int16
中的数据,而不是更大的浮点类型