2017-08-10 31 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()'都被調用(它可以在'與......一起循環);那是對的嗎? –

相關問題