Je rencontre des problèmes de fuite de mémoire dans un script perl que j'exécute pendant de longues périodes, où la quantité de mémoire prise par perl continue d'augmenter. Pour cette raison, j'essaie d'utiliser Devel::Leak pour traquer la fuite. J'ai découvert que chaque fois que j'appelle la méthode prepare
de DBI, le nombre de valeurs scalaires retournées par Devel::Leak
augmente de un. Ci-dessous se trouve un script de test que j'ai concocté qui fait ce que je viens de décrire :
#!/usr/bin/perl
use strict;
use Devel::Leak;
use DBI;
START:
my $handle; # apparemment, cela ne doit être rien du tout
my $leaveCount = 0;
my $enterCount = Devel::Leak::NoteSV($handle);
print "ENTRER : $enterCount SVs\n";
{
# VARIABLES DE CONFIGURATION
my $platform = "mysql";
my $database = "db";
my $host = "localhost";
my $port = "3306";
my $user = "user";
my $pw = "pass";
# NOM DE LA SOURCE DE DONNÉES
my $dsn = "dbi:mysql:$database:$host:3306";
# CONNEXION PERL DBI
my $dbh = DBI->connect($dsn, $user, $pw);
$dbh->prepare("SELECT * FROM table"); # Le script semble gagner un SV sans cette
# ligne ici, mais puisque c'est mon problème dans mon
# script principal, j'ai décidé de la laisser
# undef $dbh; J'ai essayé de le mettre à undefined, mais cela n'a pas fait de différence
}
$leaveCount = Devel::Leak::CheckSV($handle);
print "\nQUITTER : $leaveCount SVs\n";
sleep(1);
goto START;
Est-ce que j'ai commis une erreur ici, ou s'agit-il d'une fuite de mémoire dans le module DBI ? De plus, je sais qu'ajouter un SV à chaque tour de boucle n'est pas une grosse affaire, et que j'ai probablement des fuites de mémoire plus importantes ailleurs qui font que perl prend autant de mémoire du serveur. Cependant, j'aimerais quand même corriger cela si je le pouvais. Curiosité du programmeur :)
MISE À JOUR :
La première fois, il semble ajouter environ 3 000 SV, puis à chaque fois après, il augmente un à la fois.