私はメモリに格納するには大きすぎる大きなデータ行列(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番目の列のみを変更するには、何を行う/変更する必要がありますか?
は[こちら](http://docs.julialang.org/en/release-0.4/stdlib/io-network/#memory-mapped-i-o)ここで使用できますか? – daycaster
おそらく、ベクトル更新で 'stream_data = open(" data "、" w ")'を 'stream_data = open(" data "、" w + ")'に変更してください。 'w +'に注意してください。関連ドキュメントはhttp://docs.julialang.org/en/release-0.4/stdlib/io-network/#Base.open –
[SharedArrays](http://docs.julialang.org/en/release-0.4)です。 /stdlib/parallel/#Base.SharedArray)は、あなたのために指定したばかりのすべてを行います。ファイル名が –