我有一个大矩阵(2e6 x 3),我必须将其写入文本文件。
dlmwrite 大约需要 230 秒才能完成这项任务。
根据您的经验,将大型矩阵写入文本文件的最快方法是什么?
以下适用于 MATLAB,但我建议您在 Octave 中尝试。首先,如果可以的话 - 转置矩阵。以下是使用fprintf
and csvwrite
(本质上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
打开文件,但这并没有太大改善这里的情况。
你试过这个吗?与 dlmwrite 相比,我不确定它的速度。
a = [1 2;3 4];
save temp.txt a;
拥有一个变量data
,您可以将其保存为text
具有空格分隔值的格式(包括标题):
save out.txt data
可以使用基本的 Unix 命令简单地删除标头,tail
例如(在任何 Linux/Mac OS 上):
tail -n +6 out.txt > file.csv
从理论上讲,根据@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.
应该试试。。
在 Matlab 中使用:
save -ascii output.txt variableName
在 Octave 中使用它:
save hello1.m variableName -ascii
在我的系统中
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 倍,所以我只尝试了 size = 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.
我的结论是:
各种方法之间的速度比较很大程度上取决于系统。然后,您将不得不自己尝试。
Acorbe的提议没有达到他的预期。