Python 将大型光栅数据输入PyTables的有效方法

Python 将大型光栅数据输入PyTables的有效方法,python,numpy,scipy,gdal,pytables,Python,Numpy,Scipy,Gdal,Pytables,我正在寻找一种有效的方法,将20GB大小的光栅数据文件(GeoTiff)输入PyTables,以便进一步进行核心外计算 目前,我正在使用Gdal将其读取为numpy数组,并将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

我正在寻找一种有效的方法,将20GB大小的光栅数据文件(GeoTiff)输入PyTables,以便进一步进行核心外计算

目前,我正在使用Gdal将其读取为numpy数组,并将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或任何改进代码的建议?

我没有geotiff文件,所以我摆弄了一个普通的tif文件。如果将数据写入pytables文件,则可能必须在形状中省略3,在写入时省略切片。本质上,我在数组上循环,而不是一次将所有内容读入内存。您必须调整n_块,以便一次性读取的块大小不会超过系统内存

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)

我现在没有时间给出一个完整的答案,但基本上,你只需要把geotiff分块读入内存
ReadAsArray
采用可选的xoffset、yoffset、xwindow和ywindow参数(以“像素”为单位),允许您仅读取阵列的一个子集。您可以创建“full”PyTables数组,然后将geotiff中的每一行/任何内容读入内存,并分配PyTables数组中相应的行/任何内容。希望这能有所帮助,无论如何!我真的不知道如何将numpy读取的整个图像部分中的多个数组组合到PyTables中的单个数组中。非常感谢您的完整答复。