Я пытаюсь работать с данными из очень больших файлов netCDF (~ 400 Gb каждый). Каждый файл имеет несколько переменных, все намного больше, чем системная память (например, 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. Или какой-то способ эффективного переноса массива.