J'ai eu récemment analyser plusieurs fichiers journaux d'environ 6 gigaoctets chacun. La mise en mémoire tampon était un problème puisque Perl aurait heureusement essayé de lire ces 6 gigaoctets en mémoire quand j'attribuerais le STDIN à un tableau ... Cependant, je n'avais tout simplement pas les ressources système disponibles pour le faire. Je suis venu avec la solution de contournement suivante qui lit simplement le fichier ligne par ligne et, par conséquent, évite le vortex de mémoire tampon blackhole massive qui réquisitionnerait autrement toutes mes ressources système.
note: Tout ce script fait est divisé ce fichier de 6 gigaoctets en plusieurs plus petits (dont la taille est dictée par le nombre de lignes à contenir dans chaque fichier de sortie). Le bit intéressant est la boucle while et l'affectation d'une seule ligne du fichier journal à la variable. La boucle parcourt tout le fichier en lisant une seule ligne, en faisant quelque chose avec elle, puis en répétant. Résultat, pas de mise en mémoire tampon massive ... J'ai gardé tout le script intact juste pour montrer un exemple de travail ...
#!/usr/bin/perl -w
BEGIN{$ENV{'POSIXLY_CORRECT'} = 1;}
use v5.14;
use Getopt::Long qw(:config no_ignore_case);
my $input = '';
my $output = '';
my $lines = 0;
GetOptions('i=s' => \$input, 'o=s' => \$output, 'l=i' => \$lines);
open FI, '<', $input;
my $count = 0;
my $count_file = 1;
while($count < $lines){
my $line = <FI>; #assign a single line of input to a variable
last unless defined($line);
open FO, '>>', "$output\_$count_file\.log";
print FO $line;
$count++;
if($count == $lines){
$count=0;
$count_file++;
}
}
print " done\n";
script est appelé sur la ligne de commande comme:
(nom du script) -i (fichier d'entrée) -o (fichier de sortie) -l (taille de fichier de sortie (nombre de lignes)
Même si ce ne est pas exactement ce que vous cherchez, je l'espère, il vous donnera quelques idées :)
Etes-vous sûr 'cat fff. | perl -e 'system ("./ 1.pl")' 'imprime le contenu? pour moi seulement 'cat fff | perl 1.pl' fait. – tuxuday