2012-01-03 1 views
4

Le problème que j'ai peut être trouvé en exécutant le code suivant dans Strawberry perl 5.12.3.0 sur Windows XP."Mémoire insuffisante" avec simple boucle de readline de fichier Win32 :: Unicode :: et Strawberry Perl

#!/usr/bin/perl -w 

    use strict; 
    use warnings; 
    use Win32::Unicode::File; 
    use Encode; 

    my $fname = shift @ARGV; 

    my $fh = Win32::Unicode::File->new; 
    if ($fh->open('<', $fname)){ 
     while (my $line = $fh->readline()){} 
     close $fh; 
    }else{ 
     print "Couldn't open file: $!\n"; 
    } 

La seule chose qui se passe ici est que je joue un readline et cette mémoire jusqu'à ce que nous continuons à manger je reçois une erreur de dépassement de mémoire de Strawberry Perl. J'utilise un très gros fichier mais comme ce code est basé sur un flux, cela ne devrait pas avoir d'importance. Ai-je manqué quelque chose ici ou y a-t-il une fuite quelque part dans Strawberry perl? J'ai testé exactement le même code dans ActivePerl et là ça fonctionne très bien, c'est-à-dire qu'il ne mange pas de mémoire. Mise à jour: Remplacer Win32 :: Unicode :: File avec l'opérateur de diamant normal semble fonctionner sur ma distribution au moins. Voir le code suivant.

use strict; 
    use warnings; 

    my $fname = shift @ARGV; 

    if (open(my $fh, '<', $fname)){ 
     while (my $line = <$fh>){} 
     close $fh; 
    }else{ print "Couldn't open file: $!\n";} 

Donc, ce qui suggère que le problème réside avec le module Win32 :: Unicode droit?

+1

Le fichier comporte-t-il des sauts de ligne? Tenter de lire une ligne pourrait finir par lire le fichier entier. – ikegami

+1

@ikegami oui le fichier a des sauts de ligne et chaque ligne ne dépasse pas 255 caractères. –

+1

Je suggérerais de mettre une instruction d'impression pour chaque ligne lue au lieu d'un bloc vide, ainsi vous pouvez voir que les lignes sont vraiment lues. Imprimez simplement "." ferait. Aussi, assurez-vous que vous avez vraiment $ line et non @line qui lirait le fichier entier. –

Répondre

1

Un peu peu orthodoxe, je suppose, mais je vais répondre à ma propre question. J'ai remplacé le package Win32 :: Unicode :: File avec le package Path :: Class :: Unicode à la place pour lire le fichier Unicode. Cela fonctionne bien (c'est-à-dire pas de mémoire) donc il semble que le problème se trouve dans le package Win32 :: Unicode :: File et est probablement un bug. J'ai contacté l'auteur du colis et il se penche sur le problème. S'il vous plaît laissez-moi savoir si vous voulez que je fournisse le code. C'est assez simple.

1

Peut-être que $/(ou $ INPUT_RECORD_SEPARATOR) n'est pas une nouvelle ligne? Ou $ [(index du premier élément de tableau et premier caractère dans une (sous) chaîne) n'est pas 0.

Ces deux variables sont utilisées par le module pendant la lecture ou la readline.

BTW: C'est tellement sacrément lent car il utilise 3 appels de fonctions pour lire chaque ligne un caractère à la fois, puis appelle Encode :: decode pour chaque caractère lu, puis l'ajoute au tampon de ligne que readline renvoie à votre code . Yuck!

+0

Je suis d'accord .. Yuck! –

Questions connexes