2010-08-05 3 views
2

J'ai un code Perl:fuite de mémoire dans HTML :: TreeBuilder

use HTML::Parse; 
use HTML::FormatText; 

# ... 

my $txtFormatter = HTML::FormatText->new(); 

while (...) { # some condition 
    my $txt = # get from a file 
    my $html_tree = HTML::TreeBuilder->new_from_content($txt); 
    $txt = $txtFormatter->format($html_tree); 
    $html_tree->delete(); 
    # write $txt to a file 
} 

Je remarqué le processus perl.exe augmente régulièrement en taille (jusqu'à 600 Mo après 2 millions ou itérations de la boucle). Si je supprime le HTML::TreeBuilder, cela n'augmentera pas du tout. Y at-il quelque chose que je peux faire pour brancher cette fuite?

+0

Voir: [motifs de fuite de référence de mémoire commune Perl] (http://stackoverflow.com/questions/2223721/common-perl-memory-reference-leak-patterns) et [Perl utilisation de la mémoire: profilage et détection de fuite] (http://stackoverflow.com/questions/1359771/perl-memory-usage-profiling-and-leak-detection). – Ether

+0

Très bien, mais je ne veux pas déboguer HTML :: TreeBuilder! – JoelFan

+1

Quelle version de 'HTML :: TreeBuilder' utilisez-vous? Quelle version de 'perl'? Vous obtenez l'image. –

Répondre

0

Je ne peux pas reproduire ce avec le script suivant:

#!/usr/bin/perl 

use strict; use warnings; 

use File::Slurp; 
use HTML::FormatText; 
use HTML::TreeBuilder; 

my $formatter = HTML::FormatText->new; 
my $html = read_file 'test.html'; 

while (1) { 
    my $tree = HTML::TreeBuilder->new_from_content($html); 
    $formatter->format($tree); 
    $tree->delete; 
} 

je laisse cette course de script pour les minutes et l'utilisation de la mémoire (dans le Gestionnaire des tâches) est resté entre 7,200K et 7,300K.

E:\Home> perl -v 

This is perl, v5.10.1 built for MSWin32-x86-multi-thread 
(with 2 registered patches, see perl -V for more detail) 

Copyright 1987-2009, Larry Wall 

Binary build 1006 [291086] provided by ActiveState http://www.ActiveState.com 
Built Aug 24 2009 13:48:26
E:\Home> perl -MHTML::TreeBuilder -e "print $HTML::TreeBuilder::VERSION" 
3.23
E:\Home> perl -MHTML::FormatText -e "print $HTML::FormatText::VERSION" 
2.04
+0

J'ai les mêmes versions de TreeBuilder et FormatText. Mon Perl est 5.12.0, cependant, et c'est Strawberry, pas ActiveState. Hmmm ... – JoelFan

+0

Je n'ai pas 'perl' 5.12.0 de Strawberry sur ce système. Cependant, avec Strawberry 'perl' 5.10.1, je vois l'utilisation de la mémoire rester entre 7.600K et 7.700K. –