У меня есть большая матрица (2e6 x 3), которую я должен записать в текстовый файл.
dlmwrite занимает около 230 секунд для достижения этой задачи.
Из вашего опыта, что является самым быстрым способом записи большой матрицы в текстовый файл?
У меня есть большая матрица (2e6 x 3), которую я должен записать в текстовый файл.
dlmwrite занимает около 230 секунд для достижения этой задачи.
Из вашего опыта, что является самым быстрым способом записи большой матрицы в текстовый файл?
Следующее относится к MATLAB, но я предлагаю вам попробовать его в Octave. Прежде всего, если вы можете - транспонировать матрицу. Вот примеры с использованием fprintf
и 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
в кусках, чтобы избежать бесполезной промывки буфера, т.е.
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 раз медленнее других, я пробовал его только с размером = 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 не соответствует его ожиданиям.