В своих экспериментах я пробовал:
xr.open_dataset
сchunks
аргументом, и он загружает данные в память.- Настройте
NetCDF4DataStore
и вызовитеds['field'].values
, и он загрузит данные в память. - Установите
ScipyDataStore
сmmap='r'
, иds['field'].values
загружает данные в память.
Из того, что я видел, дизайн, похоже, сосредоточен не на фактическом применении функций numpy к массивам с отображением памяти, а скорее на загрузке небольших фрагментов в память (иногда с использованием отображения памяти для этого). Например, этот комментарий. И несколько связанный комментарий здесь о том, что xarray не может определить, является ли массив numpy mmapped или нет.
Я хотел бы иметь возможность представлять и нарезать данные как xarray.Dataset
, а также иметь возможность вызывать .values
(или .data
), чтобы получить ndarray
, но чтобы он оставался mmapped (для целей совместно используемой памяти и т. Д.).
Также было бы неплохо, если бы операции dask с фрагментами могли, по крайней мере, работать с отображенным в память массивом до тех пор, пока ему действительно не нужно что-то видоизменить, что кажется возможным, поскольку dask, похоже, спроектирован вокруг неизменяемых массивов.
Тем не менее, я нашел трюк с xarray, который должен сделать так:
data=np.load('file.npy', mmap_mode='r')
ds=xr.Dataset({'foo': (['dim1', 'dim2'], data)})
На этом этапе такие вещи, как следующие, работают без загрузки в память:
np.sum(ds['foo'].values)
np.sum(ds['foo'][::2,:].values)
... xarray, по-видимому, не знает, что массив является mmapped, и не может позволить наложить np.copy
для таких случаев.
Есть ли «поддерживаемый» способ сделать memmapping только для чтения (или копирующую запись, если на то пошло) в xarray или dask?