私はテキストファイルに書き込まなければならない大きな行列(2e6 x 3)を持っています。Octaveでテキストファイルに行列を書き込む最も速い方法は何ですか?
このタスクを達成するためにdlmwriteは約230秒かかる。
あなたの経験から、大きなマトリックスをテキストファイルに書き込む最も速い方法は何ですか?
私はテキストファイルに書き込まなければならない大きな行列(2e6 x 3)を持っています。Octaveでテキストファイルに行列を書き込む最も速い方法は何ですか?
このタスクを達成するためにdlmwriteは約230秒かかる。
あなたの経験から、大きなマトリックスをテキストファイルに書き込む最も速い方法は何ですか?
次はMATLABに適用されますが、Octaveで試してみることをお勧めします。まず第一に、もしあなたができるなら - 行列を転置します。ここでは転置されていない場合、それは確かに年齢を取る
A = rand(3, 1e6);
tic;
fid = fopen('data.txt', 'w+');
for i=1:size(A, 1)
fprintf(fid, '%f ', A(i,:));
fprintf(fid, '\n');
end
fclose(fid);
toc
tic;
csvwrite('data.txt', A);
toc;
Elapsed time is 1.311512 seconds.
Elapsed time is 2.487737 seconds.
(本質的dlmwrite
)fprintf
とcsvwrite
を用いた例です。 By default, fprintf
flushes the buffer after every call。ファイルを開くにはw
の代わりにW
を使用することができますが、ここではあまり状況を改善しません。
参考書Octaveでcsvwriteを試しましたが、正常に動作します。 –
明示的なループを避け、 'fprintf(fid、 '%f%f%f \ n'、A)'を使用することもできます。また、fprintfは変数に適用されたフォーマットを列方向にリサイクルします。例: 'tic; fid = fopen( 'data.txt'、 'w +'); fprintf(fid、 'a =%f b =%f c =%f \ n'、A); fclose(fid); toc' 経過時間は2.019833秒です。 1e6行のそれぞれに3つの数字と改行を与えます。 –
理論的には、@angainorが言うによると、1にもパフォーマンスを向上させることができ 無用バッファのフラッシュを避けるために、ラッピングチャンクで何とか
for i=1:size(A, 1)
fprintf(fid, '%f ', A(i,:));
fprintf(fid, '\n');
end
を、
1. coverting (in memory) numbers->string + introduction of termination characters '\n'
(for say K matrix rows)
2. writing of the obtained string to file through fscanf.
を試みるべきiedoing ..
あなたは(ヘッダを含む)スペース区切りでtext
形式で保存することができdata
変数を有します(すべてのLinux/MacのOS上):
tail -n +6 out.txt > file.csv
使用これを:オクターブで
save -ascii output.txt variableName
使用この:あなたは `の` -ascii`オプションを
save hello1.m variableName -ascii
てみました保存する。つまり、 'save -ascii output.txt variableName' – petrichor
データを保存するだけでいいですか、それともテキストファイルでフォーマットする必要がありますか? @ petrichorのアイデアはうまくいくはずです。 – twerdster