J'ai un énorme fichier (près de 50GB, juste une matrice en ASCII composée de 360K lignes, chacune avec 15K nombres), et j'ai besoin de le transposer. Pour éviter de tout lire en mémoire, j'ai écrit un script Perl script qui ouvre 15K fichiers (un pour chaque colonne de la matrice) et procède en lisant une ligne complète du fichier d'entrée, et en écrivant chaque nombre à la fin de son fichier correspondant (le premier nombre dans le fichier de sortie column0.txt, le deuxième dans le fichier de sortie column1.txt, etc.)
Les choses semblaient prometteuses : le code n'utilise que 178MB de RAM et les tests initiaux avec une partie seulement du fichier d'entrée se déroulent parfaitement : il traite 3600 lignes en une minute environ, et j'espérais donc terminer le tout en deux heures environ, mais lorsque j'exécute le vrai programme, le code s'arrête à de nombreux endroits. Par exemple, au début, il a traité ~4600 lignes très rapidement, puis s'est arrêté pendant un certain temps (peut-être 5-10 minutes) avant de continuer. En ce moment, après ~10 heures de calcul, il a traité 131K lignes et le code s'arrête pendant deux-trois minutes après avoir traité 300-400 lignes.
Je n'ai jamais travaillé avec des fichiers d'entrée aussi volumineux ni avec autant de fichiers ouverts, et je ne sais donc pas si le problème vient de l'entrée ou du nombre de descripteurs de fichiers. Des conseils sur la manière de diagnostiquer (et, je l'espère, de résoudre) le problème de vitesse ? J'ai inclus la partie pertinente du programme ci-dessous
Remerciements
\==================================
for ($i=0 ; $i<$columnas ; $i++) {
$column[$i] = IO::File->new(">column$i.txt") or die $!;
}
while (<DATA>) {
chomp;
$cols = split;
for ($col=0 ; $col<$cols ; $col++) {
print { $column[$col] } "$_[$col] " ;
}
}
close (DATA) or die $!;