2017-08-10 158 views
0

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

理想的情况下,像

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

不知道这是一个有意义的问题,但希望能够安全地,放心地控制这种行为巨型数据集,因此整个文件不会被不必要地读。

+0

我实际上并不认为这在xarray目前使用公共API是可能的。 @shoyer会有一个明确的答案。 – jhamman

回答

-1

我认为你可以通过dataset.chunks来检查你的数据集是否被分块。基于这一点,你可以构建功能检测数据集是否已装入与否,例如:

def is_loaded(chunks): 
    out = False 
    if chunks is not None: 
     out = True 
    return out 
print(is_loaded(dataset.chunks)) 
+0

这不起作用。无论数据集是否使用dask分块,Xarray都使用延迟加载。 – jhamman

+0

@jhamman感谢您的澄清。 – Ales

1

这使用公共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)。在这种情况下,你不会看到在_dataMemoryCachedArray对象:

>>> 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。

+0

很酷,谢谢!因此,如果我使用'cache = False',那么在我调用Dataset或DataArray slice上的'.load()'之前,数据是否会被加载(例如,我有一个具有20个变量和1000个时间步长的NetCDF,但是想要在1个时间步从1个变量创建一个DataArray)?而如果我试图在DataArray中加载DataArray之后加2,会怎么样?该操作是否会强制加载到内存中,还是会引发错误? 'xarray'是令人惊叹的,令人难以置信的有用的方式。 –

+0

没错,即使使用'cache = False',索引也很懒。乘法不是懒惰的,除非你使用了dask。 – shoyer

+0

我明白了。我也想了解'xarray'行为与'netCDF4'的不同之处。对于后者,除非您使用[[:]'索引数据集对象,否则数据不会“加载到内存”中;例如'用netCDF4.Dataset('file.nc','r')作为d:x = d ['variable']',调用'print(x)'时会出错。你必须使用'x = d ['variable'] [:]'将数据加载到numpy的ndarray中。然而,似乎用'xarray',一个可读的对象被创建**不管是否将''cache'设置为'True'或'False'或'load()'都被调用(它可以在'与......一起循环);那是对的吗? –

相关问题