【发布时间】:2017-06-24 05:23:42
【问题描述】:
到目前为止,在我的实验中,我已经尝试过:
-
xr.open_dataset和chunksarg,它将数据加载到内存中。 - 设置
NetCDF4DataStore,调用ds['field'].values,它将数据加载到内存中。 - 使用
mmap='r'设置ScipyDataStore,然后ds['field'].values将数据加载到内存中。
据我所见,设计似乎不是围绕在内存映射数组上实际应用 numpy 函数,而是将小块加载到内存中(有时使用内存映射来这样做)。例如,this comment。还有一些相关的评论 here 关于 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。
在 xarray 或 dask 中是否有“支持”的方式来进行只读内存映射(或复制时写入)?
【问题讨论】:
标签: numpy dask numpy-memmap xarray