Эффективный способ ввода больших растровых данных в PyTables

Я ищу эффективный способ загрузить файл растровых данных (GeoTiff) размером 20 ГБ в PyTables для дальнейшего вычисления ядра.

В настоящее время я читаю его как массив numpy с помощью Gdal и записываю массив numpy в pytables, используя следующий код:

import gdal, numpy as np, tables as tb

inraster = gdal.Open('infile.tif').ReadAsArray().astype(np.float32)
f = tb.openFile('myhdf.h5','w')
dataset = f.createCArray(f.root, 'mydata', atom=tb.Float32Atom(),shape=np.shape(inraster)
dataset[:] = inraster
dataset.flush()
dataset.close()
f.close()
inraster = None

К сожалению, поскольку мой входной файл чрезвычайно велик, при чтении его в качестве ошибки numpy на моем ПК отображается ошибка памяти. Есть ли альтернативный способ подачи данных в PyTables или какие-либо предложения по улучшению моего кода?

Ответ 1

У меня нет файла geotiff, поэтому я работал с обычным tif файлом. Возможно, вам придется опустить 3 в форме и срез в записи, если данные в файл pytables. По сути, я петлю над массивом, не читая все в память за один раз. Вы должны настроить n_chunks так, чтобы chunksize, который читается за один раз, не превышает вашу системную память.

ds=gdal.Open('infile.tif')

x_total,y_total=ds.RasterXSize,ds.RasterYSize

n_chunks=100

f = tb.openFile('myhdf.h5','w')
dataset = f.createCArray(f.root, 'mydata', atom=tb.Float32Atom(),shape=(3,y_total,x_total)


#prepare the chunk indices
x_offsets=linspace(0,x_total,n_chunks).astype(int)
x_offsets=zip(x_offsets[:-1],x_offsets[1:])
y_offsets=linspace(0,y_total,n_chunks).astype(int)
y_offsets=zip(y_offsets[:-1],y_offsets[1:])

for x1,x2 in x_offsets:
    for y1,y2 in y_offsets:
        dataset[:,y1:y2,x1:x2]=ds.ReadAsArray(xoff=x1,yoff=y1,xsize=x2-x1, ysize=y2-y1)