首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用xarray将zarr文件转换为netcdf,导致内存分配错误。

使用xarray将zarr文件转换为netcdf,导致内存分配错误。
EN

Stack Overflow用户
提问于 2022-08-17 20:31:30
回答 1查看 158关注 0票数 1

我有一个zarr文件,我想把它转换成netcdf,它太大了,不适合内存。我的电脑有32‘t的内存,所以写5.5GB的块应该不是问题。然而,在运行此脚本后的几秒钟内,我的内存使用量很快就超过了可用的~20 my,脚本就失败了。

资料来源:Dropbox链接至zarr文件,包含美国2014年6月28日的雷达降雨数据,总数约为1.8GB。

代码:

代码语言:javascript
复制
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}})

输出:

代码语言:javascript
复制
MemoryError: Unable to allocate 5.48 GiB for an array with shape (30, 3500, 7000) and data type float64

包版本:

代码语言:javascript
复制
dask                         2022.7.0
xarray                       2022.3.0
zarr                          2.8.1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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范围内。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73394589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档