我正在寻找一种有效的方法,将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或任何改进我的代码的建议?
答案 0 :(得分:8)
我没有geotiff文件,所以我摆弄了一个普通的tif文件。如果数据到pytables文件,您可能必须省略形状中的3和写入中的切片。本质上,我循环遍历数组而不是一次性将所有内容都读入内存。您必须调整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)