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

标签 python python-3.x memory ipython python-xarray

python 中的xarray 包似乎使用“延迟加载”来指向磁盘上的结构化数据(例如netCDF、HDF5),然后是loads the data into memory。仅在“必要时”。如何检查交互式 python session 或 python 脚本中的给定数据集或 DataArray 对象是否实际“加载”?

理想情况下,类似

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

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

最佳答案

目前使用公共(public) API 无法做到这一点。此信息使用私有(private) 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 - 如何检查 python xarray Dataset/DataArray 对象是否已加载到内存中,或者是否仍指向磁盘上的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45622581/

相关文章:

python - QRubberBand.geometry().intersects(???) 如何在QGraphicsScene中找到相交的图像?

python - 如何在Python中选择性地深复制?

python - 如何更改标题栏上的图标?

ios - 为什么iOS BLE通信时会出现这么多NSNotification,如何释放?

c++ - 删除基于堆的对象后,STL 容器会释放内存吗?

python - 线性回归的矩阵预处理

python - 在 YARN 上运行 Spark 作业

python - 如何比较pandas大型数据帧(python3.x)中的两个字符串?

python - 在 python 3 中禁用异常链接

c - Lua 垃圾回收 : Will reassigned userdata have its __gc meta event triggered?