如何检查 python xarray Dataset/DataArray 对象是否已加载到内存中,或者是否仍指向磁盘上的数据?
How can I check whether a python xarray Dataset/DataArray object is loaded into memory, or still points to data on disk?
python中的xarray
包似乎使用"lazy loading"指向磁盘上的结构化数据(例如netCDF,HDF5),然后loads the data into memory仅"when necessary." 如何检查交互式 python 会话或 python 脚本中给定的 Dataset 或 DataArray 对象是否实际上是 "loaded?"
理想情况下,像
import xarray as xr
dataset = xr.open_dataset('data.nc')
dataset.is_loaded() # is it loaded into memory?
不确定这是否是一个有意义的问题,但希望能够安全、自信地控制巨型数据集的这种行为,以免不必要地读取整个文件。
我认为您可以通过 dataset.chunks
检查您的数据集是否被分块。在此基础上,您可以构造函数来检测您的数据集是否已加载,例如:
def is_loaded(chunks):
out = False
if chunks is not None:
out = True
return out
print(is_loaded(dataset.chunks))
目前无法使用 public 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)))))
如果您的数据足够大以至于您担心缓存会出现问题,我绝对建议您使用 cache=False
打开任何文件,例如 xarray.open_dataarray('foo.nc', cache=False)
。在这种情况下,您将不会在 _data
:
中看到 MemoryCachedArray
对象
>>> 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))))
如果您仍然认为需要能够检查现有 xarray 对象是否可以缓存,请在我们的 GitHub 页面上提出问题以讨论潜在的新 API.
python中的xarray
包似乎使用"lazy loading"指向磁盘上的结构化数据(例如netCDF,HDF5),然后loads the data into memory仅"when necessary." 如何检查交互式 python 会话或 python 脚本中给定的 Dataset 或 DataArray 对象是否实际上是 "loaded?"
理想情况下,像
import xarray as xr
dataset = xr.open_dataset('data.nc')
dataset.is_loaded() # is it loaded into memory?
不确定这是否是一个有意义的问题,但希望能够安全、自信地控制巨型数据集的这种行为,以免不必要地读取整个文件。
我认为您可以通过 dataset.chunks
检查您的数据集是否被分块。在此基础上,您可以构造函数来检测您的数据集是否已加载,例如:
def is_loaded(chunks):
out = False
if chunks is not None:
out = True
return out
print(is_loaded(dataset.chunks))
目前无法使用 public 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)))))
如果您的数据足够大以至于您担心缓存会出现问题,我绝对建议您使用 cache=False
打开任何文件,例如 xarray.open_dataarray('foo.nc', cache=False)
。在这种情况下,您将不会在 _data
:
MemoryCachedArray
对象
>>> 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))))
如果您仍然认为需要能够检查现有 xarray 对象是否可以缓存,请在我们的 GitHub 页面上提出问题以讨论潜在的新 API.