我有一个zarr文件,我想把它转换成netcdf,它太大了,不适合内存。我的电脑有32‘t的内存,所以写5.5GB的块应该不是问题。然而,在运行此脚本后的几秒钟内,我的内存使用量很快就超过了可用的~20 my,脚本就失败了。
资料来源:Dropbox链接至zarr文件,包含美国2014年6月28日的雷达降雨数据,总数约为1.8GB。
代码:
import xarray as xr
import zarr
fpath_zarr = "out_zarr_20140628.zarr"
ds_from_zarr = xr.open_zarr(store=fpath_zarr, chunks={'outlat':3500, 'outlon':7000, 'time':30})
ds_from_zarr.to_netcdf("ds_zarr_to_nc.nc", encoding= {"rainrate":{"zlib":True}})输出:
MemoryError: Unable to allocate 5.48 GiB for an array with shape (30, 3500, 7000) and data type float64包版本:
dask 2022.7.0
xarray 2022.3.0
zarr 2.8.1发布于 2022-08-17 23:59:24
见dask数组的最佳实践文档。“选择一个很好的块大小”一节内容如下:
Dask Array用户的一个常见性能问题是,他们选择的块大小要么太小(导致大量开销),要么与数据不一致(导致读取效率低下)。 虽然最佳大小和形状是高度问题特定的,但很少看到块大小小于100 MB。如果您处理的是float64数据,那么对于2D数组而言,这是
(4000, 4000)大小,对于3D数组则是(100, 400, 400)。 您希望选择一个较大的块大小,以减少Dask必须考虑的块数量(这会影响开销),但也要足够小,以便它们中的许多可以同时存储在内存中。Dask的内存块数量通常是活动线程数量的两倍。
我想这里的问题是,5.48GB* n_workers *2远远超过了您可用的32 GB内存,因此,在任何给定的时间点上,您的一个工作人员都可能会失败,因此dask认为整个工作都是一个问题。
避免这种情况的最好方法是减少你的块大小。正如docs注意到的,最佳的分块策略取决于您的工作流、集群设置和硬件;根据我的经验,最好将您的任务数量保持在100万任务以下,并且您的块大小在150 my 1 GB范围内。
https://stackoverflow.com/questions/73394589
复制相似问题