Forum Programmation.perl Consommation mémoire excessive

Posté par  (site web personnel) .
Étiquettes :
0
30
nov.
2005
Bonsoir, suite à https://linuxfr.org/~golum/20068.html , j'ai écrit en perl le code correspondant.

Je suis politiquement content puisqu'il marche, mais informatiquement dubitatif puisqu'il me bouffe plus de 40 mo au bout d'une heure d'utilisation.

De bonne âmes pourraient-elles m'expliquer pourquoi (pour apprendre aux lecteurs ignorants) et proposer des solutions ?
Merci :)

Voici le code :

#!/usr/bin/perl

use WWW::Mechanize;

use strict;
use diagnostics;
use warnings;

my @url_list =
(
'http://www.google.fr/search?num=100&hl=fr&client=fir(...)

'http://www.google.fr/search?num=100&hl=fr&client=fir(...)

'http://www.google.fr/search?num=100&hl=fr&client=fir(...)

'http://www.google.fr/search?num=100&hl=fr&client=fir(...)

'http://www.google.fr/search?num=100&hl=fr&client=fir(...)

'http://www.google.fr/search?num=100&hl=fr&client=fir(...)

'http://www.google.fr/search?num=100&hl=fr&client=fir(...)
);

my $mech = WWW::Mechanize->new( autocheck => 1 );

for (my $i=0 ; $i< 512 ; $i++)
{


foreach my $url_google (@url_list) {


$mech->get( $url_google );
sleep (rand(32));
my $htmltext = $mech->content;

if ( $htmltext =~ /www\.u\-m\-p\.org\/site\/soutien_projet_2007/ )
{
my @txt = grep (/u\-m\-p\.org/,split(/\s|href=/,$htmltext));
foreach my $t (@txt){
if ($t =~ /soutien_projet_2007/ ) {
# On l'a trouvé !!
my $good_url = 'http://www.google.fr'.$t;
print $good_url,"\n";
$mech->get($good_url);
if ($mech->content =~ /Mouvement\sPopulaire/) { # on est bien tombé sur la bonne page
print '1 Hit effectué',"\n";
}
}

}
}
}
}
  • # On pourrait avoir ton code dans une version facilement recopiable?

    Posté par  (site web personnel) . Évalué à 3.

    Désolé, je connais rien à perl, donc je vais pas répondre à tes questions. Par contre j'aurais bien fait tourner ton petit script un petit moment ;-) Je suis sûr de ne pas être le seul dans mon cas!!
  • # WWW::Mechanize

    Posté par  (site web personnel) . Évalué à 2.

    Je pense qu'il y a gros problèmes de mem leak au niveau de WWW::Mechanize, en effet, j'ai réalisé moi-même une application qui utilise WWW::Mechanize (un appel par minute), et je me suis rendu compte qu'après 24 heures d'utilisation, j'avais de grosses fuites mémoire (de l'ordre de 50-100Mo). Il est donc possible que ça vienne de là, et pas de ton script. Si tu as le temps, essaye de faire un code "proof of concept", et de remonter le bug au(x) développeur(s) de WWW::Mechanize.
  • # Compilable ?

    Posté par  (site web personnel) . Évalué à 1.

    Tiens en psaant, j'ai oublié de poser la question, c'est compilable ce genre de chose ?

    « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

  • # POE & patch pour le beugue

    Posté par  (site web personnel) . Évalué à 3.

    POE permet de faire ce que tu veux.

    http://poe.perl.org/ pour le site. normalement, c'est disponible dans toutes les distrib.

    sinon pour ton bug, c logique ce qui t'arrive.

    WWW::Mechanize peut gerer des ensembles d'URL. donc ton bug est la :

    my $mech = WWW::Mechanize->new( autocheck => 1 );
    for (my $i=0 ; $i< 512 ; $i++) {
    foreach my $url_google (@url_list) {
    $mech->get( $url_google );


    si par hasard, tu ne vois pas pourquoi ... je te donne la reponse ... tu fais un $mech->get( $url_google ); ... et donc tu dois garder les anciennes sessions et tu ajoutes une nouvelle.

    je suis sur que vu que ton appli n'est pas time-critical , que tu peux faire un truc du genre :

    for (my $i=0 ; $i< 512 ; $i++) {
    foreach my $url_google (@url_list) {
    my $mech = WWW::Mechanize->new( autocheck => 1 );
    $mech->get( $url_google );


    pour la doc :
    http://search.cpan.org/dist/WWW-Mechanize/lib/WWW/Mechanize.(...)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.