3

グリッド化する必要のあるxyzテキストファイルがあります。各xyzファイルについて、セルサイズの原点座標と行/列の数に関する情報があります。ただし、xyzファイルにz値がないレコードが欠落しているため、現在のレコードからグリッドを作成するだけでは、値が欠落しているために失敗します。だから私はこれを試しました:

nxyz = np.loadtxt(infile,delimiter=",",skiprows=1)

ncols = 4781
nrows = 4405
xllcorner = 682373.533843
yllcorner = 205266.898604
cellsize = 1.25

grid = np.zeros((nrows,ncols))

for item in nxyz:
    idx = (item[0]-xllcorner)/cellsize
    idy = (item[1]-yllcorner)/cellsize
    grid[idy,idx] = item[2]

outfile = open(r"e:\test\myrasout.txt","w")
np.savetxt(outfile,grid[::-1], fmt="%.2f",delimiter= " ")
outfile.close()

これにより、xyzファイルにレコードが存在しないゼロのグリッドが表示されます。小さいファイルでは機能しますが、290Mbサイズ(〜8900000レコード)のファイルでメモリ不足エラーが発生しました。そして、これは私が処理しなければならない最大のファイルではありません。

そこで、xyzファイルをロードするためにここで見つけたJoe Kingtonによる別の(反復)アプローチを試しました。これは290MBのファイルでは機能しましたが、次に大きいファイル(533MB、〜15600000レコード)でメモリ不足エラーが発生して失敗しました。

メモリを使い果たすことなく、これらの大きなファイルを正しくグリッド化するにはどうすればよいですか(欠落しているレコードを考慮に入れて)?

4

2 に答える 2

2

コメントに基づいて、コードを次のように変更します

ncols = 4781
nrows = 4405
xllcorner = 682373.533843
yllcorner = 205266.898604
cellsize = 1.25
grid = np.zeros((nrows,ncols))

with open(file) as f:
    for line in f:
        item = line.split() # fill with whatever is separating the values 
        idx = (item[0]-xllcorner)/cellsize
        idy = (item[1]-yllcorner)/cellsize
        #...
于 2012-10-03T13:09:57.383 に答える
1

NumPyを使用して派手なインデックス作成を行うことができます。おそらくyuor問題の根本であるループの代わりに、次のようなものを使用してみてください。

grid = np.zeros((nrows,ncols))
grid[nxyz[:,0],nxyz[:,1]] = nxyz[:,2]

原点とセルサイズの変換では、もう少し複雑になります。

grid = np.zeros((nrows,ncols))
grid[(nxyz[:,0]-x11corner)/cellsize,(nxyz[:,1]-y11corner)/cellsize] = nxyz[:,2]

これが役に立たない場合は、nxyz配列が大きすぎますが、私はそれを疑っています。そうである場合は、テキストファイルをいくつかの部分にロードし、各部分に対して上記を順番に実行できます。

PSおそらく、テキストファイルに含まれるデータの範囲を知っているでしょう。ファイルのロード中にこれを明示的に指定することで、メモリ使用量を制限できます。最大16ビットの整数を処理している場合は、次のようになりますnp.loadtxt("myfile.txt", dtype=int16)

于 2012-10-03T12:55:12.943 に答える