到目前为止,在我的实验中,我尝试过:
xr.open_dataset
使用chunks
arg,它将数据加载到内存中。- 设置一个
NetCDF4DataStore
, 并调用ds['field'].values
,它将数据加载到内存中。 - 设置一个
ScipyDataStore
withmmap='r'
,并将ds['field'].values
数据加载到内存中。
从我所见,设计似乎不是围绕在内存映射数组上实际应用 numpy 函数,而是将小块加载到内存中(有时使用内存映射来这样做)。例如,这条评论。这里还有一些相关的评论,关于 not xarray 无法确定一个 numpy 数组是否被映射。
我希望能够将数据表示和切片为xarray.Dataset
,并能够调用.values
(或.data
)来获取ndarray
,但让它保持映射(出于共享内存等目的)。
如果分块的 dask 操作至少可以在内存映射数组上操作,直到它真正需要改变某些东西,这也很好,这似乎是可能的,因为 dask 似乎是围绕不可变数组设计的。
不过,我确实发现了一个使用 xarray 的技巧,就是这样做的:
data=np.load('file.npy', mmap_mode='r')
ds=xr.Dataset({'foo': (['dim1', 'dim2'], data)})
在这一点上,类似以下的工作无需将任何内容加载到内存中:
np.sum(ds['foo'].values)
np.sum(ds['foo'][::2,:].values)
...xarray 显然不知道该数组已映射,并且不能np.copy
为此类情况强加 a 。
是否有“支持”的方式在 xarray 或 dask 中进行只读内存映射(或就此而言的复制写入)?