13

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

dlmwrite は、このタスクを完了するのに約 230 秒かかります。

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

4

6 に答える 6

7

これを試しましたか?dlmwrite と比較した場合の速度についてはわかりません。

a = [1 2;3 4];
save temp.txt a;
于 2013-08-20T19:13:06.667 に答える
0

理論的には、@angainor の言うことによると、何らかの方法でパフォーマンス ラッピングを改善することさえできます。

for i=1:size(A, 1)
   fprintf(fid, '%f ', A(i,:));
   fprintf(fid, '\n');
end

無駄なバッファのフラッシュを避けるためにチャンクで、iedoing

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.

試してみるべき..

于 2012-10-17T14:12:59.800 に答える
0

私のシステムでは

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. アコルベの提案は彼の期待に応えられない.

于 2019-09-19T06:26:34.017 に答える