J'ai une grande matrice (2e6 x 3) que je dois écrire dans un fichier texte.
dlmwrite prend environ 230 secondes pour réaliser cette tâche.
D'après votre expérience, quel est le moyen le plus rapide d'écrire une grande matrice dans un fichier texte?
Ce qui suit s’applique à MATLAB, mais je vous suggère de l’essayer dans Octave. Tout d’abord, si vous le pouvez - transposez la matrice. Voici des exemples utilisant fprintf
et csvwrite
(essentiellement 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.
Si ce n'est pas transposé, cela prendra des siècles. Par défaut, fprintf
vide le tampon après chaque appel . Vous pouvez essayer d'utiliser W
au lieu de w
pour ouvrir le fichier, mais cela n'améliore pas trop la situation.
Avez-vous essayé cela? Je ne suis pas sûr de sa vitesse par rapport à dlmwrite.
a = [1 2;3 4];
save temp.txt a;
Ayant une variable data
, vous pouvez l'enregistrer au format text
avec des valeurs séparées par des espaces (y compris un en-tête):
save out.txt data
L'en-tête peut être simplement supprimé à l'aide de la commande Unix de base tail
p. Ex. (sur tout Linux/Mac OS):
tail -n +6 out.txt > file.csv
Utilisez ceci dans Matlab:
save -ascii output.txt variableName
Utilisez ceci dans Octave:
save hello1.m variableName -ascii
Théoriquement, selon ce que @angainor a dit, on peut même améliorer les performances
for i=1:size(A, 1)
fprintf(fid, '%f ', A(i,:));
fprintf(fid, '\n');
end
en morceaux pour éviter le vidage inutile du tampon, c.-à-d.
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.
Faut essayer ...