Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Perl & MySQL => Base en memoire ?

5 réponses
Avatar
Mag
Bonjour,

J'aimerais faire un petit concept dans mon script perl
mais je n'ai aucune idee de comment le faire.
Je suis pas tres bonne et donc encore en "apprentissage".

J'aimerais recuperer trois champs d'une table MySQL

Id:desi:code

qui ressemble a cela dans ma base Sql la table code:

1:Cdo124:100004
2:Cdo125:100013
3:Cdo126:100022
4:Cdo127:100117
5:Cdo128:100292

(une 40 ene d'enregistrement uniquement)


et les mettres en memoire pour les retrouver et les exploiter tout
au long de mon script.

Celui prends un fichier de logs, l'analyse et pour chaque ligne fait
une interrogation de la table code pour trouver la desi d'apres le code.

Cela fait donc environ 10000 requetes sur la table code pour obtenir
bien souvent la meme info.


J'aimerais donc en debut de mon script "charger" la base code dans un
tableau (ou memoire) et m'en servir comme une base de donnée.

C'est possible ?
Comment mettre les data dans le tableau puis faire une requete dedans
pour trouver l'info ?

Merci d'avance pour votre aide

5 réponses

Avatar
Jogo
Sur fr.comp.lang.perl, Mag disait :

et les mettres en memoire pour les retrouver et les exploiter tout
au long de mon script.

Celui prends un fichier de logs, l'analyse et pour chaque ligne fait
une interrogation de la table code pour trouver la desi d'apres le
code.


Tu peux utiliser une table de hashage :

unless (exists($cache{$code})) {
$sth->execute($code) ;
($cache{$code}) = $sth->fetchrow_array() ;
} ;
$desi = $cache{$code} ;

Mais si ton serveur SQL est sur la même machine que le script Perl, ce
n'est pas sûr que cela soit plus rapide. Je te conseille de faire des tests.

--
[...] en prenant l'argent des pauvres et en le donnant aux riches,
nous stimulons l'effort et, partant, l'économie
- John Kenneth Galbraith -

Avatar
Mag
Sur fr.comp.lang.perl, Mag disait :

et les mettres en memoire pour les retrouver et les exploiter tout
au long de mon script.

Celui prends un fichier de logs, l'analyse et pour chaque ligne fait
une interrogation de la table code pour trouver la desi d'apres le
code.


Tu peux utiliser une table de hashage :

unless (exists($cache{$code})) {
$sth->execute($code) ;
($cache{$code}) = $sth->fetchrow_array() ;
} ;
$desi = $cache{$code} ;



Merci pour ta reponse, mais je n'arrive pas trop a comprendre
ton code.
Je fais donc la connexion a la bdd
mais tu execute $code via sth sans avaoir avant defini $code ?
il manque pas a un endroit un "sth->prepare" ?
La requete Sqlje la place ou ?

Mais si ton serveur SQL est sur la même machine que le script Perl, ce
n'est pas sûr que cela soit plus rapide. Je te conseille de faire des tests.


Non, ce n'est pas sur la meme machine mais surtout il y a X machine qui
font la meme requete sur la meme table au meme moment.


Merci d'avance, je vais faire en meme temps une recherche sur les
tabels de hashages sur google


Avatar
Jogo
Sur fr.comp.lang.perl, Mag disait :

Tu peux utiliser une table de hashage :

unless (exists($cache{$code})) {
$sth->execute($code) ;
($cache{$code}) = $sth->fetchrow_array() ;
} ;
$desi = $cache{$code} ;



Merci pour ta reponse, mais je n'arrive pas trop a comprendre
ton code.


Il s'agit de l'interrieur de ta boucle. Tu n'as pas donné de code, je
ne pouvais donc pas deviner le reste de ton programme. Schématiquement
on a :

my $dbh = DBI->connect blabla ;
my $sth = $dbh->prepare(q{ blabla avec un placeholder pour $code
my $code ;
my $file ;
open ($file,'<',fichier_log) or die(blabla) ;
while (<$file>) {
blabla où tu récupères $code
mon code ci-dessus
blabla où tu utilises $cache{$code} pour la désignation
} ;
close($file) ;
$dbh->disconnect() ;

Mais si ton serveur SQL est sur la même machine que le script Perl,
ce n'est pas sûr que cela soit plus rapide. Je te conseille de
faire des tests.


Non, ce n'est pas sur la meme machine mais surtout il y a X machine
qui font la meme requete sur la meme table au meme moment.


Normalement le serveur doit optimiser un maximum cette requête, mais
c'est vrai que la BP et le ping peut ralentir.

Merci d'avance, je vais faire en meme temps une recherche sur les
tabels de hashages sur google


En français :
http://perl.enstimac.fr/DocFr/perlintro.html

--
et je ne fais aucunes fautes d'orthographes en tappant au clavier sans
le regarder et surtout sans utiliser un dictionnaire correctif de
fautes...
-+- EB in www.le-gnu.net : Un singulier pluriel -+-


Avatar
Jogo
Sur fr.comp.lang.perl, Mag disait :

$dbh = DBI->connect($connectionInfo,$userid,$passwd);
my %listdomaines;
$sth = $dbh->prepare("select domaine,id from domaines");
$sth->execute();
while (@row1 = $sth->fetchrow_array) {
$listdomaines{"@row1[0]"} = @row1[1];
}

Cela marche pas encore, mais bon c'est sur la voie


Essaie : $listdomaines{$row1[0]} = $row1[1];

Pour éviter ce genre d'erreur, *il faut toujours* commencer
ses scripts par :
use strict ;
use warnings ;

Sinon, ton idée de charger toute la base de donnés est certainement
mauvaise, car tu vas charger même les valeurs que tu n'utiliseras
jamais.

--
Jesus dies for somebody's sins but not mine...

Avatar
Paul Gaborit
À (at) Fri, 11 May 2007 09:58:49 +0200,
Mag écrivait (wrote):
Bon ba je coince un peu ;=)

Je mets tout mon script de test ;=)

je trouve pas mon erreur (enfin je suis pas assez
experimenté pour la trouver)

Je pensais que $domainetrouve = $hash{mondomaine.fr};
allait me donner le Id correspondant dans ma base sql ..
mais non cela reste vide


Si vous ne trouvez pas l'erreur, c'est parce que vous ne savez pas
lire les réponses qui vous ont été faites. En particulier l'extrait
suivant...

Pour éviter ce genre d'erreur, *il faut toujours* commencer
ses scripts par :
use strict ;
use warnings ;



--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>