2016-12-23 9 views
0

私は、フロート32の前に40バイトのヘッダーを巨大な配列として出力するプログラムを持っています。プログラムはstdoutに書き込みます。外部プログラムの出力をパイプしてデータをnumpy配列にロードする

出力をファイルにダンプし、Pythonで開き、ヘッダーの40バイトをスキップし、numpy.fromfile()を使用してnumpyにロードできます。しかし、それは多くの時間がかかります。

私がしたいのは、それを生成するプログラムのstdoutを読むことによって配列をnumpyに直接ロードすることです。しかし、私はこれを考え出すのに苦労しています。

ありがとうございます!

+0

[このようなバイナリデータをtmpストレージのないnumpy配列にパイプする方法は?](http://stackoverflow.com/questions/13059444/how-to-pipe-binary-data-into-numpy-arrays-without -tmp-storage) – davedwards

+0

どのようなオペレーティングシステムを使用していますか? – DyZ

答えて

0

memory-mapファイルを読むのではなく、そのファイルを読み取ることができます。これはほとんどない時間がかかります。もちろん

np.memmap(filename, np.float32, offset=40) 

を、実際の結果からデータを読み込むには時間がかかりますが、おそらくこれは、計算してI/Oをインターリーブすることによって非表示になります。

あなたが本当にデータが今までディスクに書き込むことしたくない場合は、stdout=subprocess.PIPEを使用してプログラムを実行し、numpy.fromfile()に直接結果の標準出力ファイルのようなオブジェクトを渡すためにsubprocess.Popen()を使用することができます。

0

回答したすべての方に感謝します。

私は downshiftのアドバイスに従って、彼が提供するリンク...

に見て、思い付いたfolowing:

nLayers=<Number of layers in program output> 
nRows=<Number of rows in layer> 
nCols=<Number of columns in layer> 
nBytes=<Number of bytes for each value> 
noDataValue=<Value used to code no data in program output> 
DataType=<appropriate numpy data type for values> 

perLayer=nRows*nCols*nBytes 

proc = sp.Popen(cmd+args, stdout = sp.PIPE, shell=True) 
data=bytearray() 
for i in range(0,nLayers): 
    dump40=proc.stdout.read(40) 
    data=data+bytearray(proc.stdout.read(perLayer)) 
ndata = np.frombuffer(data, dtype=DataType) 
ndata[ndata == noDataValue]=np.nan 
ndata.shape = (nLayers,nRows,nCols) 

ここで同じ読み取りを使用していますnumpy.frombufferを使用しているキーバッファを使用してダーレを作成し、メモリ内のデータを複製する必要がなくなります。

関連する問題