Я пытаюсь работать с данными из очень больших файлов netCDF (~ 400 ГБ каждый). Каждый файл имеет несколько переменных, все они намного больше, чем системная память (например, 180 ГБ против 32 ГБ ОЗУ). Я пытаюсь использовать numpy и netCDF4-python для выполнения некоторых операций с этими переменными, копируя фрагмент за раз и работая с этим фрагментом. К сожалению, чтение каждого фрагмента занимает очень много времени, что снижает производительность.
Например, одна из переменных представляет собой массив формы (500, 500, 450, 300)
. Я хочу работать со срезом [:,:,0]
, поэтому делаю следующее:
import netCDF4 as nc
f = nc.Dataset('myfile.ncdf','r+')
myvar = f.variables['myvar']
myslice = myvar[:,:,0]
Но последний шаг занимает очень много времени (~ 5 минут в моей системе). Если, например, я сохранил переменную формы (500, 500, 300)
в файле netcdf, то операция чтения того же размера займет всего несколько секунд.
Есть ли способ ускорить это? Очевидным путем было бы транспонировать массив так, чтобы индексы, которые я выбираю, появлялись первыми. Но в таком большом файле это было бы невозможно сделать в памяти, и кажется еще медленнее пытаться сделать это, учитывая, что простая операция и так занимает много времени. Что мне нужно, так это быстрый способ чтения фрагмента файла netcdf в стиле функции get_vara интерфейса Fortran. Или какой-то способ эффективного переноса массива.
xarray
модуль: предоставляет очень удобный интерфейс дляdask
массивов с нехваткой памяти. - person j08lue   schedule 25.04.2016