到目前为止,在我的实验中,我尝试过:
xr.open_dataset使用chunksarg,它将数据加载到内存中。- 设置一个
NetCDF4DataStore, 并调用ds['field'].values,它将数据加载到内存中。 - 设置一个
ScipyDataStorewithmmap='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 中进行只读内存映射(或就此而言的复制写入)?