chr*_*ber 5 numpy dask numpy-memmap xarray
到目前为止,我已经尝试过:
xr.open_dataset使用chunksarg,它将数据加载到内存中。NetCDF4DataStore,然后调用ds['field'].values,它将数据加载到内存中。ScipyDataStore与mmap='r'和ds['field'].values数据加载到内存中。从我所看到的情况来看,该设计似乎不围绕在内存映射的数组上实际应用numpy函数,而是将小块加载到内存中(有时使用内存映射来实现)。例如,此注释。而有些相关评论点击这里了解不xarray不能够确定一个numpy的阵列是否mmapped与否。
我希望能够将数据表示和切片为xarray.Dataset,并能够调用.values(或.data)以获取ndarray,但仍将其映射(为共享内存等目的)。
如果分块的dask操作至少可以在内存映射的数组上运行,直到它实际上需要进行某些更改,这也是很好的,因为dask似乎是围绕不可变数组设计的,因此这似乎是可能的。
我确实找到了xarray的窍门,就是这样做的:
data=np.load('file.npy', mmap_mode='r')
ds=xr.Dataset({'foo': (['dim1', 'dim2'], data)})
Run Code Online (Sandbox Code Playgroud)
在这一点上,类似以下内容的工作无需将任何内容加载到内存中:
np.sum(ds['foo'].values)
np.sum(ds['foo'][::2,:].values)
Run Code Online (Sandbox Code Playgroud)
... xarray显然不知道该数组是否被映射,因此无法承受np.copy此类情况。
是否存在“受支持的”方式在xarray或dask中进行只读映射(或对此事进行复制复制)?
xr.open_dataset和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
Run Code Online (Sandbox Code Playgroud)
<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 操作可能是惰性的,并且按块工作(如果进行切片,则只会加载所需的块)
arr.sum()
Run Code Online (Sandbox Code Playgroud)
<xarray.DataArray 'ROSE' ()>
dask.array<sum-aggregate, shape=(), dtype=float64, chunksize=()>
arr.sum().values # evaluates
Run Code Online (Sandbox Code Playgroud)
然而,这与内存映射不同,所以如果这不能回答您的问题,我将不胜感激。
使用 dask 的线程调度程序,内存中的值可供其他工作线程使用,因此共享将非常高效。相反,分布式调度程序非常擅长识别何时可以在计算图内或图之间重用结果。
| 归档时间: |
|
| 查看次数: |
935 次 |
| 最近记录: |