OVH Cloud OVH Cloud

Pb avec BINMODE sur les gros fichiers

2 réponses
Avatar
Ghislain Lambert
Bonjour

J'ai constaté un blocage de mon script lorsque j'utilise binmode sur un gros
fichier (>7Mo)

open(IN, $filename);
binmode(IN);
undef $/;

while (my $data = <IN>) {

my $uudata = pack 'u*', $data;
print $socket $uudata;


}

close IN

j'ecris dans un socket ... est ce lié?

Quelqu'un a t'il une explication et une solution?

merci

2 réponses

Avatar
jl_morel
Dans l'article <3faf8407$0$225$,
fr a dit...

J'ai constaté un blocage de mon script lorsque j'utilise binmode sur un gros
fichier (>7Mo)

open(IN, $filename);
binmode(IN);
undef $/;

while (my $data = <IN>) {

my $uudata = pack 'u*', $data;
print $socket $uudata;


}

close IN

j'ecris dans un socket ... est ce lié?

Quelqu'un a t'il une explication et une solution?



Si vous faites undef $/; vous êtes en mode "slurp".
Votre boucle While ne sert à rien : elle n'est parcourue qu'une fois. Tout
votre fichier se retrouve d'un coup dans $data, d'où un problème d'espace
mémoire si le fichier est très gros.

Vous pouvez fixer la valeur max des enregistrements avec $/
Voir perlvar:

http://www.bribes.org/perl/docfr/perlvar.html#LFFBFBD33


open(IN, $filename);
binmode(IN);
local $/ = (256*1_024); # lecture par paquets de 256 ko

while (my $data = <IN>) {
my $uudata = pack 'u*', $data;
print $socket $uudata;
}
close IN


--
J-L.M.

Avatar
Ghislain Lambert
merci pour votre reponse

effectivement tout se passe nettement mieux .


"Jean-Louis MOREL" a écrit dans le message de
news:boonl9$20a$
Dans l'article <3faf8407$0$225$,


fr a dit...

J'ai constaté un blocage de mon script lorsque j'utilise binmode sur un
gros


fichier (>7Mo)

open(IN, $filename);
binmode(IN);
undef $/;

while (my $data = <IN>) {

my $uudata = pack 'u*', $data;
print $socket $uudata;


}

close IN

j'ecris dans un socket ... est ce lié?

Quelqu'un a t'il une explication et une solution?



Si vous faites undef $/; vous êtes en mode "slurp".
Votre boucle While ne sert à rien : elle n'est parcourue qu'une fois. Tout
votre fichier se retrouve d'un coup dans $data, d'où un problème d'espace
mémoire si le fichier est très gros.

Vous pouvez fixer la valeur max des enregistrements avec $/
Voir perlvar:

http://www.bribes.org/perl/docfr/perlvar.html#LFFBFBD33


open(IN, $filename);
binmode(IN);
local $/ = (256*1_024); # lecture par paquets de 256 ko

while (my $data = <IN>) {
my $uudata = pack 'u*', $data;
print $socket $uudata;
}
close IN


--
J-L.M.