OVH Cloud OVH Cloud

Perl et connection MySQL

2 réponses
Avatar
Alexandre Bornand
Bonjour,

J'ai un petit problème,

Je dois entrer des informations contenues dans des fichiers texte dans une
base de donnée MySQL.

le nombre de fichier avoisine les 1 million, pour faire cette migration, je
travaille avec une machine sous linux et environ 128 Mo de RAM.

Lorsque je lance le traitement, tout se passe bien jusqu'à ce que j'arrive
dans les alentours du 300'000 ème fichiers, et là tout s'arrête avec un joli
message du style:

DBI->connect(database=mp3;host=192.168.0.114) failed: Can't create a new
thread (errno 11). If you are not out of available memory, you can consult
the manual for a possible OS-dependent bug at ./Get_Album.pl line 19
Can't create a new thread (errno 11). If you are not out of available
memory, you can consult the manual for a possible OS-dependent bug at
./Get_Album.pl line 19.
ignored


et voici la procédure qui contient la ligne 19

sub Get_Album_ID
{
my ( $Album_Name ) = @_;
my ( $cur, $qry, $Recordset, @Row );
$qry = "SELECT * from tb_Album WHERE Album_Name like '%$Album_Name%'";

--> $dbh = DBI->connect($data_source, $username, $password) <-- ligne
19
or die $DBI::errstr;
$cur = $dbh->prepare($qry);
$cur->execute()
or print("Error Album $Album_Name\n" );
@Row = $cur->fetchrow_array();
$dbh->disconnect();
return $Row[0];
}


Je pense que lors de la déconnexion sur la base de donnée MySQL j'ai
toujours la mémoire réservée et lorsque j'ouvre à nouveau une connexion, je
resèrve à nouveau de la mémoire et ceci sans la libérer.

Je ne sais pas si c'est à moi de le faire explicitement, si oui merci de
m'indiquer comment. Dans le cas contraire, je pense que le problème devrait
provenir du module DBI.

Alors ma question est comment puis-je libérer la mémoire de ma connexion ?

Merci pour vos réponses.

Cdt

A. Bornand

2 réponses

Avatar
Jean-Michel Hiver
Alexandre Bornand wrote:
Bonjour,

J'ai un petit problème,

Je dois entrer des informations contenues dans des fichiers texte dans une
base de donnée MySQL.

le nombre de fichier avoisine les 1 million, pour faire cette migration, je
travaille avec une machine sous linux et environ 128 Mo de RAM.

Lorsque je lance le traitement, tout se passe bien jusqu'à ce que j'arrive
dans les alentours du 300'000 ème fichiers, et là tout s'arrête avec un joli
message du style:

DBI->connect(database=mp3;host2.168.0.114) failed: Can't create a new
thread (errno 11). If you are not out of available memory, you can consult
the manual for a possible OS-dependent bug at ./Get_Album.pl line 19
Can't create a new thread (errno 11). If you are not out of available
memory, you can consult the manual for a possible OS-dependent bug at
./Get_Album.pl line 19.
ignored


et voici la procédure qui contient la ligne 19

sub Get_Album_ID
{
my ( $Album_Name ) = @_;
my ( $cur, $qry, $Recordset, @Row );
$qry = "SELECT * from tb_Album WHERE Album_Name like '%$Album_Name%'";

--> $dbh = DBI->connect($data_source, $username, $password) <-- ligne
19
or die $DBI::errstr;
$cur = $dbh->prepare($qry);
$cur->execute()
or print("Error Album $Album_Namen" );
@Row = $cur->fetchrow_array();
$dbh->disconnect();
return $Row[0];
}


Au lieu de te connecter pour chaque insertion, connecte toi au debut du
script et laisse la connection ouverte.

Par exemple:


initialize();
main();
finalize();

sub initialize
{
$::DBH = DBI->connect($data_source, $username, $password) or
die $DBI::errstr;
}


sub finalize
{
$::DBH->disconnect();
}


sub main
{
pleins();
d_appels();
de_fonctions();
}


sub Get_Album_ID
{
my ( $Album_Name ) = @_;
my ( $cur, $qry, $Recordset, @Row );
$qry = "SELECT * from tb_Album WHERE Album_Name like
'%$Album_Name%'";

$cur = $::DBH->prepare ($qry); #deja connecte!
# etc...
}

Avatar
Alexandre Bornand
[..]

Au lieu de te connecter pour chaque insertion, connecte toi au debut du
script et laisse la connection ouverte.



Hello

Merci pour la réponse, en effet, j'y avais pensé.

Mais pas mis en pratique.

ALors je l'ai mis en pratique et apparemment le problème est résolu,
toutefois le processus me prend 30Mo pour le moment.

Je trouve tout de même curieux que lors de la fermeture de la connection la
mémoire utilisée n'est pas réstituée.

Cdt

[..]