Numpy xarray或dask真的支持内存映射吗?

Numpy xarray或dask真的支持内存映射吗?,numpy,dask,numpy-memmap,xarray,Numpy,Dask,Numpy Memmap,Xarray,到目前为止,在我的实验中,我尝试了: xr.使用chunksarg打开数据集,然后将数据加载到内存中 设置netcdf4数据存储,并调用ds['field']。值将数据加载到内存中 使用mmap='r'和ds['field']设置ScipyDataStore。值将数据加载到内存中 从我所看到的,设计的中心似乎不是在内存映射数组上实际应用numpy函数,而是将小块加载到内存中(有时使用内存映射)。例如还有一些相关的评论,关于xarray不能确定是否映射了numpy数组 我希望能够将数据表示为x

到目前为止,在我的实验中,我尝试了:

  • xr.使用
    chunks
    arg打开数据集
    ,然后将数据加载到内存中
  • 设置
    netcdf4数据存储
    ,并调用
    ds['field']。值
    将数据加载到内存中
  • 使用
    mmap='r'
    ds['field']设置
    ScipyDataStore
    。值将数据加载到内存中
从我所看到的,设计的中心似乎不是在内存映射数组上实际应用numpy函数,而是将小块加载到内存中(有时使用内存映射)。例如还有一些相关的评论,关于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中是否有一种“受支持的”只读内存映射方法(或在写时复制)?

xr.open\u dataset
with
chunks=
不应立即将数据加载到内存中,它应创建一个
dask.array
,该数组的计算速度较慢

testfile = '/Users/mdurant/data/smith_sandwell_topo_v8_2.nc'
arr = xr.open_dataset(testfile, chunks={'latitude': 6336//11, 'longitude': 10800//15}).ROSE
arr 

dask阵列
协调:
*经度(经度)浮动32 0.0166667 0.05 0.0833333 0.116667 0.15。。。
*纬度(纬度)浮动32-72.0009-71.9905-71.9802-71.9699。。。
属性:
长名称:地形和测深(8123m->10799m)
单位:米
有效_范围:[-32766 32767]
未打包的\u缺少\u值:-32767.0
(注意上面的dask.array)

很多xarray操作可能是惰性的,并且是分块工作的(如果切片,则只加载所需的块)


dask阵列

但是,这与内存映射不同,因此如果这不能回答您的问题,我将不胜感激


使用dask的线程调度程序,内存中的值可供其他工作人员使用,因此共享将非常有效。相反,分布式调度器非常擅长识别结果何时可以在计算图内或图之间重用。

我认为如果xarray/dask支持通过和通过内存映射,那会很酷。但另一方面,块的延迟加载在功能上几乎是等价的。我假设xarray默认使用dask.threaded调度程序。我正在围绕一个xarray/CF风格的数据模型构建一个服务器(用于web可视化应用程序通过websocket访问和查询),并试图决定是否依赖上面描述的memmapping hack以及我自己的并行化,而不是完全依赖dask。数据本身是只读的,但对于某些查询,基于某些参数/过滤器计算动态掩码数组可能很有用。这就是可变sharedmem数组可能派上用场的地方。虽然使用dask计算每个请求的掩码也可以。我自己还有更多的调查要做。顺便说一句,我可能会接受你的回答,因为我的问题似乎是关于xarray不支持/未记录的方面,这是一个很高的要求。是的,dask默认使用线程调度程序,因此xarray也是如此,除非你创建了分布式客户端。对于HDF文件,这是可取的,因为否则可能存在进程间文件锁定问题。对于通过xarray/dask对大型数据集进行交互式可视化,您可能希望深入研究。我担心任务图,如
((arr>0.75)*arr).sum()
会占用大量内存,因为
(arr>0.75)
中间计算是整个数组的大小。但现在我觉得很明显,这个足迹只会是chunksize*Nthreads。我认为这将非常适合我的应用程序,而不需要任何memmapping。我正在使用诸如
da.einsum
之类的函数进行服务器端的统计查询,而可视化组件目前非常简单。Datashader看起来很棒,感谢HDF锁定技巧。
arr.sum()
arr.sum().values    # evaluates