web-dev-qa-db-ja.com

Octaveで行列をテキストファイルに書き込む最も速い方法は何ですか?

テキストファイルに書き込む必要のある大きな行列(2e6 x 3)があります。

dlmwriteがこのタスクを実行するには、約230秒かかります。

あなたの経験から、大きな行列をテキストファイルに書き込む最も速い方法は何ですか?

13
Steven

以下はMATLABに適用されますが、Octaveで試すことをお勧めします。まず第一に、できれば-行列を転置します。 fprintfcsvwrite(基本的にはdlmwrite)を使用した例を次に示します

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.

転置されない場合は、確かに時間がかかります。 デフォルトでは、fprintfは呼び出しごとにバッファをフラッシュしますWの代わりにwを使用してファイルを開くこともできますが、ここでは状況があまり改善されません。

16
angainor

やってみましたか? dlmwriteと比較した場合の速度はわかりません。

a = [1 2;3 4];
save temp.txt a;
7
Anant Gupta

変数dataがあると、スペースで区切られた値(ヘッダーを含む)を含むtext形式で保存できます。

save out.txt data

ヘッダーは、基本的なUnixコマンド tail を使用して簡単に削除できます。 (任意のLinux/Mac OS):

tail -n +6 out.txt > file.csv
2
Tombart

これをMatlabで使用します。

 save -ascii output.txt variableName

Octaveでこれを使用します。

 save hello1.m variableName -ascii 
0
Akash Kandpal

理論的には、@ angainorによると、パフォーマンスの折り返しをどうにかして改善することもできます

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.

試してみる必要があります。

0
Acorbe

私のシステムでは

A = Rand(3, 1e6);

# Method with fprintf
tic;
fid = fopen('data1.txt', 'w+');
for i=1:size(A, 1)
    fprintf(fid, '%f ', A(i,:));
    fprintf(fid, '\n');
end
fclose(fid);
toc

# Method with sprintf
tic;
s = "";
for i=1:size(A, 1)
    s = strcat( s, sprintf('%f ', A(i,:)) );
    s = strcat( s, sprintf('\n') );
end
fid = fopen('data2.txt', 'w+');
    fprintf(fid, '%s\n', s);
fclose(fid);
toc

# Method with save
tic;
save 'data3.txt' A;
toc;

return;  # Commented when the size is <= 1e5

# Method with csvwrite
tic;
csvwrite('data4.txt', A);
toc;

与える

>> Elapsed time is 5.36293 seconds.
Elapsed time is 6.43252 seconds.
Elapsed time is 6.09889 seconds.

csvwriteは他のものより約10倍遅いため、サイズ= 10 ^ -5でのみ試してみました。その場合、

>> Elapsed time is 0.541885 seconds.
Elapsed time is 0.657595 seconds.
Elapsed time is 0.576796 seconds.
Elapsed time is 4.24433 seconds.

私の結論は:

  1. さまざまな方法の速度の比較は、システムに大きく依存しています。次に、自分で試してみる必要があります。

  2. Acorbeによる提案 は彼の期待に応えていません。