Paket xarray di python tampaknya menggunakan "lazy loading" untuk menunjuk ke data terstruktur pada disk (misalnya netCDF, HDF5), lalu memuat data ke dalam memori hanya "bila perlu". Bagaimana saya bisa memeriksa apakah objek Dataset atau DataArray yang diberikan dalam sesi python interaktif atau dalam skrip python sebenarnya "dimuat?"

Idealnya, sesuatu seperti

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

Tidak yakin apakah ini pertanyaan yang bermakna, tetapi ingin dapat dengan aman dan percaya diri mengontrol perilaku ini untuk kumpulan data raksasa, sehingga seluruh file tidak perlu dibaca.

3
Luke Davis 10 Agustus 2017, 23:02

2 jawaban

Jawaban Terbaik

Saat ini tidak mungkin menggunakan API publik. Informasi ini tersedia menggunakan API pribadi. Jika Anda melihat DataArray.variable._data dengan array yang dimuat dari disk, Anda akan melihat objek MemoryCachedArray (pada xarray v0.9) jika sedang di-cache:

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

Jika data Anda cukup besar sehingga Anda khawatir caching bermasalah, saya sangat menyarankan untuk membuka file apa pun dengan cache=False, mis., xarray.open_dataarray('foo.nc', cache=False). Dalam hal ini, Anda tidak akan melihat objek MemoryCachedArray di _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))))

Jika Anda masih merasa perlu memeriksa apakah caching dimungkinkan pada objek xarray yang ada, silakan ajukan masalah di halaman GitHub kami untuk membahas potensi API baru.

2
shoyer 11 Agustus 2017, 22:32

Saya pikir Anda dapat memeriksa apakah kumpulan data Anda dipotong atau tidak oleh dataset.chunks. Berdasarkan itu, Anda dapat membuat fungsi yang mendeteksi apakah set data Anda dimuat atau tidak, mis .:

def is_loaded(chunks):
   out = False
   if chunks is not None:
      out = True
   return out
print(is_loaded(dataset.chunks))
-1
Ales 11 Agustus 2017, 12:16