2012-03-30 3 views
1

J'ai un script Perl, récupère l'url comme http://1.1.1.1/1.jpg depuis MySQL en utilisant DBI, et télécharge ce fichier jpg en utilisant LWP :: Simple. C'est une boucle infinie.Utilisation de la mémoire du script Perl

while (1) { 
    my $url=&fetch_url_from_mysql; 
    if ($url){   
     &download_jpg($url); 
    } else { 
     sleep 1; 
    } 
} 

Simple simple. Je suppose que l'utilisation de la mémoire resterait dans une certaine mesure. Mais après un mois de fonctionnement continu de ce script. L'utilisation de la mémoire est de 7,5G!

Comment puis-je le profiler?

+0

Est-fetch_url_from_mysql ouverture d'une nouvelle connexion à chaque fois, et non la fermer? – xxpor

+0

Oui. J'appelle 'DBI :: connect' avant que' while loop', dans 'fetch_url_from_mysql' soit' prepare, execute, fetch et retourne $ url' – everbox

+6

En lavant votre code dans un exemple propre, vous avez emporté les parties qui utilisent réellement la mémoire. – DavidO

Répondre

1

Pour le profilage, définissez une sortie explicite. Créez un compteur et quittez votre programme si votre itération est égale ou supérieure à celle-ci.

Pour le profilage, utilisez NYTprof:

perl -d: NYTProf script.pl nytprofhtml

Mais vous avez affaire à une fuite de mémoire ici.

Lisez ceci pour trouver une fuite de mémoire: How can I find memory leaks in long-running Perl program?

Très probablement, vous avez une variable qui ne sera jamais libéré. Perl libère de la mémoire si une variable est hors de portée, mais l'une de vos variables ne sort jamais de la portée.

Utilisez $ variable = undef pour libérer de la mémoire.

Si vous portez tout votre script, nous pourrions peut-être y trouver une fuite.

salutations,