我正在寻找一种高效的方法,将20 up大小的光栅数据文件(GeoTiff)填充到PyTables中,以便进行进一步的核心计算。
目前,我正在使用Gdal将其读取为numpy数组,并使用以下代码将numpy数组写入pytable:
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错误读取时,我的PC会显示内存错误。是否有其他方法将数据输入PyTables,或者有任何改进代码的建议?
发布于 2014-07-12 23:04:17
我没有geotiff文件,所以我摆弄了一个普通的tif文件。如果数据到pytable文件中,则可能必须省略形状中的3和写入过程中的片段。本质上,我在数组上循环,而没有一次将所有内容读取到内存中。您必须调整n_chunks,以便一次读取的大块不超过您的系统内存。
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)https://stackoverflow.com/questions/22250197
复制相似问题