gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:55:26 26 4
gpt4 key购买 nike

在迄今为止的实验中,我尝试过:

  • xr.open_datasetchunks arg,并将数据加载到内存中。
  • 设置NetCDF4DataStore ,并调用ds['field'].values并将数据加载到内存中。
  • 设置ScipyDataStoremmap='r' ,和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 中进行只读内存映射(或就此而言的复制写入)?

最佳答案

xr.open_datasetchunks=不应立即将数据加载到内存中,它应该创建一个 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


<xarray.DataArray 'ROSE' (latitude: 6336, longitude: 10800)>
dask.array</Users/mdurant/data/smith_sandwell_topo_v8_2.nc:/ROSE, shape=(6336, 10800), dtype=float64, chunksize=(576, 720)>
Coordinates:
* longitude (longitude) float32 0.0166667 0.05 0.0833333 0.116667 0.15 ...
* latitude (latitude) float32 -72.0009 -71.9905 -71.9802 -71.9699 ...
Attributes:
long_name: Topography and Bathymetry ( 8123m -> -10799m)
units: meters
valid_range: [-32766 32767]
unpacked_missing_value: -32767.0
(注意上面的dask.array)

对此的许多 xarray 操作可能是惰性的,并且按 block 工作(如果进行切片,则只会加载所需的 block )

arr.sum()


<xarray.DataArray 'ROSE' ()>
dask.array<sum-aggregate, shape=(), dtype=float64, chunksize=()>

arr.sum().values    # evaluates

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

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

关于numpy - xarray 或 dask 真的支持内存映射吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44733067/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com