Context
Мне дано 177373 файла netCDF4 (общим объемом 18 ГБ). Мне нужно прочитать массив фиксированного размера (1x24) значений float32 из каждого файла и записать их в одну переменную файла .mat. Результирующая таблица в файле .mat должна иметь форму (17 373 x 24).
В каждом файле хранятся данные за один момент времени (в частности, данные за каждый час в течение примерно двух лет).
Matlab Версия: 2007b
Python 3.7
scipy 1.2.1
numpy 1.15.4
Задача
Я узнал, что запись списка пустых массивов в файл .mat приведет к созданию таблицы:
import numpy as np
import scipy.io
t1 = np.arange(0,9) # array([0,..., 8])
t2 = np.arange(10,19) # array([10,..., 18])
pyTable = [t1, t2] # [array([0,...,8]), array([10,...,18])]
scipy.io.savemat('mytable.mat', mdict={'mattable':pyTable})
Но мне не хватило памяти, когда я попытался сохранить 17 373 numy массива в списке.
Покушение
Так что теперь я пытаюсь записать в файл .mat при каждом доступе к файлу (то есть открыть файл .nc, извлечь интересующий массив (1x24) numpy, а затем записать эту строку в переменную mattable
из mytable.mat
, переходите к следующему файлу, извлекайте интересующий массив (1x24), записывайте его в mattable
и т. Д.).
Я пытался играть с кодом из this Ответ переполнения стека:
from netCDF4 import Dataset
import scipy.io
for ncfilename in ncfilenamelist:
dataset = Dataset(ncfilename, "r", format="NETCDF4")
with open('mytable.mat', 'ab') as f:
numpyrow = dataset['v'][0][:,0,0] # A (1x24) array of float32
scipy.io.savemat(f, mdict={'mattable':numpyrow})
Но код создает файл .mat, который не может быть загружен в среду Matlab. В консоли Matlab отображается следующая ошибка:
* +1036 * ??? Ошибка при использовании ==> load Не удалось прочитать MAT-файл
C: \ путь \ к \ mytable.mat
Файл может быть поврежден.