2016-07-19 5 views
6

私はメモリに格納するには大きすぎる大きなデータ行列(Nrow x Ncol)を扱っています。代わりに、データをバイナリファイルに保存するのは私の仕事の分野で標準的です。作業の性質上、一度に1つの行列にアクセスする必要があります。私はまた、列を変更し、更新された列をバイナリファイルに保存する必要があります。これまで私は、バイナリファイルとして行列を保存する方法と、バイナリファイルからメモリに行列の '列'を読み取る方法を理解しました。ただし、列の内容を編集した後、その列をバイナリファイルに保存する方法を理解することはできません。Julia:バイナリファイルとして保存された行列の列を変更するにはどうすればよいですか?

たとえば、データファイルがディスクに保存された32ビットの単位行列であるとします。

Nrow = 500 
Ncol = 325 
data = eye(Float32,Nrow,Ncol) 
stream_data = open("data","w") 
write(stream_data,data[:]) 
close(stream_data) 

ディスクからファイル全体を読み込み、その後、戻って行列に整形するのは簡単です:

stream_data = open("data","r") 
data_matrix = read(stream_data,Float32,Nrow*Ncol) 
data_matrix = reshape(data_matrix,Nrow,Ncol) 
close(stream_data) 

私が前に言ったように、私が働いているデータ行列をメモリに読み込むには大きすぎますその結果、上に書かれたコードは通常は実行することができません。代わりに、私は一度に1列で作業する必要があります。私はFLOAT32で働いているので、係数4「」「POSITION_DATA」変数であること

icol = 7 
stream_data = open("data","r") 
position_data = 4*Nrow*(icol-1) 
seek(stream_data,position_data) 
data_col = read(stream_data,Float32,Nrow) 
close(stream_data) 

注:以下は、メモリに行列の1列(例えば7列)を読み取るためのソリューションです。また、私は完全にシークコマンドがここでやっていることを理解していないが、それは私の次のテストに基づいて正しい出力を与えているように見える:

data == data_matrix  # true 
data[:,7] == data_col # true 

この問題のために、私が持って言うことができます私は、充填したカラム(すなわち第7列)がゼロと交換する必要があると判断:

data_col = zeros(Float32,size(data_col)) 

問題を今、他のいかなる影響を与えることなく、バックのバイナリファイルにこの列を保存する方法を見つけ出すことですデータ。もちろん、私はこの作業を実行するために「書き込み」を使用するつもりです。しかし、私はどのように進むべきかについて完全にはわかっていません。私は、データへのストリームを開くことから始めなければならないことを知っています。しかし、私は "w"、 "w +"、 "a"、 "a +"のどのモードを使用する必要があるのか​​よく分かりません。ここで「W」を使用して失敗した試みです:

icol = 7 
stream_data = open("data","w") 
position_data = 4*Nrow*(icol-1) 
seek(stream_data,position_data) 
write(stream_data,data_col) 
close(stream_data) 

(バイナリファイルを編集する私の失敗した前の)元のバイナリファイルがディスク上の650000バイトを占めていました。これは、行列がサイズ500×325であり、Float32数が4バイト(すなわち4×500×325 = 650000)を占めるという事実と一致する。しかし、私がバイナリファイルを編集しようとした後、バイナリファイルが現在14000バイトのスペースしか占有していないことがわかりました。クイック精神的な数学では、14000バイトが7列のデータに対応することを示しています(4 * 500 * 7 = 14000)。クイックチェックでは、バイナリファイルがすべての元のデータをサイズ500x7の新しい行列に置換し、要素がすべてゼロであることが確認されます。

stream_data = open("data","r") 
data_new_matrix = read(stream_data,Float32,Nrow*7) 
data_new_matrix = reshape(data_new_matrix,Nrow,7) 
sum(abs(data_new_matrix)) # 0.0f0 

バイナリファイルの7番目の列のみを変更するには、何を行う/変更する必要がありますか?

+0

は[こちら](http://docs.julialang.org/en/release-0.4/stdlib/io-network/#memory-mapped-i-o)ここで使用できますか? – daycaster

+0

おそらく、ベクトル更新で 'stream_data = open(" data "、" w ")'を 'stream_data = open(" data "、" w + ")'に変更してください。 'w +'に注意してください。関連ドキュメントはhttp://docs.julialang.org/en/release-0.4/stdlib/io-network/#Base.open –

+0

[SharedArrays](http://docs.julialang.org/en/release-0.4)です。 /stdlib/parallel/#Base.SharedArray)は、あなたのために指定したばかりのすべてを行います。ファイル名が –

答えて

1

、すなわち"r+"、すべての作品で"w"を置き換える

icol = 7 
stream_data = open("data","r+") 
position_data = 4*Nrow*(icol-1) 
seek(stream_data,position_data) 
write(stream_data,data_col) 
close(stream_data) 

を書きます。

openへの参照はhttp://docs.julialang.org/en/release-0.4/stdlib/io-network/#Base.openであり、さまざまなモードについて説明します。好ましくは、openは元のやや混乱しているが間違いなく遅い文字列パラメータと共に使用すべきではない。

+1

これはまさに私が望んでいたようです。そして、あなたが文字列パラメータについて何を言っているのかを理解するために、 'stream_data = open(" data "、true、true、false、false、false)'を使うよりも速くなると言っていますか?列をバイナリファイルに書き戻すためにopen( "data"、 "r +")? (そして列をメモリに読み込むための同様のもの) – Landon

1

あなたは説明の必要性のためにSharedArraysを使用することができます:あなたは(あなたが非同期の労働者を持っている場合)/からこのファイルへの読み取り/書き込みに同期を扱うことになっていることに留意して、今すぐ

data=SharedArray("/some/absolute/path/to/a/file", Float32,(Nrow,Ncols)) 
# do something with data 
data[:,1]=a[:,1].+1 
exit() 

# restart julia 
data=SharedArray("/some/absolute/path/to/a/file", Float32,(Nrow,Ncols)) 
@show data[1,1] 
# prints 1 

とあなたが何をやっているのか分からない限り、配列のサイズを変更する必要はありません。代わりにOPで

icol = 7 
stream_data = open("data","w") 
position_data = 4*Nrow*(icol-1) 
seek(stream_data,position_data) 
write(stream_data,data_col) 
close(stream_data) 

+0

これはトリックを行うように見えます。あなたがSharedArrayとしてデータを読み込むと、データがメモリにロードされるのですか、それともディスクから完全にはずれますか?それがディスクから完全に機能しない場合は、現在の列を新しい変数に抽出してメモリ内で処理できるようにするのが最も速いと思うように修正しますか? – Landon

+0

質問に答えるための資料が見つかりませんでした。一方、ジュリアの背後にある哲学を考えれば、あなたはそれを試してみて、それに応じて後で最適化してください。 –

関連する問題