Je pense avoir un problème de mise en mémoire tampon Perl car je dois lire et analyser de gros fichiers texte (créés par moi-même dans les lignes précédentes du code) pour finalement imprimer des éléments dans un autre fichier. À un certain point, après avoir lu un fichier avec 90 855 lignes et un autre du deuxième fichier, le script ne lit pas complètement une ligne du fichier.Problème de mise en mémoire tampon Perl suspecté
J'ai compté le nombre de caractères lus jusqu'à ce que cela arrive: 233 467, et j'ai donc essayé de vider le tampon et de dormir avant de lire la ligne suivante du fichier. Ça ne marche pas.
Des suggestions, s'il vous plaît?
Voici mon code:
foreach $i (@files) {
my $buff = 0;
print "Analyzing $i\n";
sleep(1);
$program = $1 if $i =~ /(\w+)_SITES/;
open(FIL, $i) or die "$!: $i\n";
while (<FIL>) {
$buff += length($_);
if ($buff >= 230000) { #FLUSH THE BUFFER, NOT WORKING!!!
$buff = 0;
sleep(1);
select((select(FIL), $| = 1)[0]);
}
undef($a);
unless ($. == 1) {
if ($o == 0) {
if (/^\d+\t(\S+)\t(\S+)\t(\d+)\t(\d+)\t(\S+)\t(\S+)\t(.*)/) {
$mirna = $1;
$target = $2;
$start = $3;
$end = $4;
$site = $5;
$comp_p = $6;
$a = $7;
$j = "${mirna}_${target}_${start}_$end";
$site_nu{$j} = "$mirna\t$target\t$start\t$end\t$site\t$comp_p"; # Store each site in a hash
}
else { #DIES HERE!!!
die "$buff characters, in line $.:$_\n"
}
}
else {
if (/^\d+\t(\S+)\t(\S+)\t(\d+)\t(\d+)\t(\S+)\t(.*)/) {
$mirna = $1;
$target = $2;
$start = $3;
$end = $4;
$site = $5;
$a = $6;
$j = "${mirna}_${target}_${start}_$end";
$site_nu{$j} = "$mirna\t$target\t$start\t$end\t$site"; # Store each site in a hash
}
}
Il meurt à "dies ICI !!" mourir, après avoir lu 3,413 caractères du deuxième fichier.
Cela arrive parce que la regex ne fonctionne pas puisque seulement la moitié de la ligne est dans $ _.
Ce script est-il à simple thread? – Glenn
La variable '$ |' contrôle le vidage automatique des * fichiers de sortie * après chaque instruction 'print'. Il n'a aucun effet sur les fichiers d'entrée, et le vidage d'un fichier d'entrée n'a aucun sens. – Borodin
Si vous essayez de lire un fichier séparé par des tabulations, vous pouvez consulter ['Text :: CSV'] (http://search.cpan.org/perldoc?Text%3A%3ACSV). Vous devriez également ajouter 'use strict; utiliser des avertissements; 'à ce script et corriger les erreurs/avertissements. Puis réécrivez le code pour réduire la portée de toutes les variables à la plus petite possible, en utilisant le mot-clé 'my'. – TLP