如何检查 python xarray Dataset/DataArray 对象是否已加载到内存中,或者仍然指向磁盘上的数据?

Luk*_*vis 6 python memory ipython python-3.x python-xarray

python中的包xarray似乎使用“延迟加载”来指向磁盘上的结构化数据(例如netCDF,HDF5),然后仅在“必要时”将数据加载到内存中。如何检查交互式 python 会话或 python 脚本中给定的 Dataset 或 DataArray 对象是否实际上已“加载”?

理想情况下,类似

import xarray as xr
dataset = xr.open_dataset('data.nc') 
dataset.is_loaded() # is it loaded into memory?
Run Code Online (Sandbox Code Playgroud)

不确定这是否是一个有意义的问题,但希望能够安全、自信地控制大型数据集的这种行为,这样整个文件就不会被不必要地读取。

sho*_*yer 4

目前使用公共 API 无法实现这一点。可使用私有 API 获取此信息。如果您查看DataArray.variable._data从磁盘加载的数组,您将看到一个MemoryCachedArray正在缓存的对象(从 xarray v0.9 开始):

>>> xarray.DataArray([[1, 2], [3, 4]]).to_netcdf('foo.nc')
>>> array = xarray.open_dataarray('foo.nc')
>>> array.variable._data
MemoryCachedArray(array=CopyOnWriteArray(array=LazilyIndexedArray(array=ScipyArrayWrapper(array=array([[1, 2],
       [3, 4]], dtype=int32)), key=(slice(None, None, None), slice(None, None, None)))))
Run Code Online (Sandbox Code Playgroud)

如果您的数据足够大,以至于您担心缓存出现问题,我绝对建议cache=False使用xarray.open_dataarray('foo.nc', cache=False). 在这种情况下,您将不会MemoryCachedArray在以下位置看到该对象_data:

>>> array.variable._data
CopyOnWriteArray(array=LazilyIndexedArray(array=ScipyArrayWrapper(array=array([[1, 2],
       [3, 4]], dtype=int32)), key=(slice(None, None, None), slice(None, None, None))))
Run Code Online (Sandbox Code Playgroud)

如果您仍然认为需要能够检查现有 xarray 对象是否可以进行缓存,请在我们的 GitHub 页面上提出问题以讨论潜在的新 API。