Base de donnée temporaire dans Perl ?

Le
Chloe Sival
Bonjour,

J'ai une petite question:

J'ai un script perl qui va mettre a jour une table MySQL, il envoi des:

UPDATE STATS_Summary_Hourly SET
mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET
mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET
mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET
mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";


Mon soucis est qu'il exécute 5000 fois le même update.

Je me demandais si j'avais un moyen de créer une sorte de table en
mémoire qui permettrait de "résumer":

trois critères:
Dom_id
Date_Start
Date_End

et des données:
mails_total
mails_rbl
MO_received
MO_blocked



qui me sortirait a la fin un

Dom_id5
Date_Start="2015-04-15 01:00:00"
Date_End="2015-04-15 01:59:59";
mails_total5
mails_rbl5
MO_received".75
MO_blocked".75

Dom_id5
Date_Start="2015-04-15 02:00:00"
Date_End="2015-04-15 02:59:59";
mails_total‚
mails_rbl‚
MO_receivedS.30
MO_blockedS.30


j'aurais réussi a "regrouper" (dans mon exemple) 117 requêtes update en
deux requêtes ;=)

merci d'avance pour vos suggestions
Chloe
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Paul Gaborit
Le #26349246
À (at) Wed, 15 Apr 2015 07:14:41 +0200,
Chloe Sival
J'ai un script perl qui va mettre a jour une table MySQL, il envoi des:


[...]

Mon soucis est qu'il exécute 5000 fois le même update.


[...]
Je me demandais si j'avais un moyen de créer une sorte de table en
mémoire qui permettrait de "résumer":


[...]

j'aurais réussi a "regrouper" (dans mon exemple) 117 requêtes update
en deux requêtes ;=)

merci d'avance pour vos suggestions



Désoalé. Mais sans description ni du but général, ni des des tables
utilisées (ici, je n'en vois qu'une) et en ne donnant comme seul exemple
qu'un seul ordre SQL répété (pourquoi le répéter 5000 fois ?), je ne
vois pas quelle suggestion faire... Si ce n'est d'exposer clairement le
souci ! ;-)

--
Paul Gaborit - Perl en français -
Benoit Izac
Le #26349245
Bonjour,

le 15/04/2015 à 07:14, Chloe Sival a écrit dans le message

J'ai un script perl qui va mettre a jour une table MySQL, il envoi des:

UPDATE STATS_Summary_Hourly SET
mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET
mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET
mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET
mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";


Mon soucis est qu'il exécute 5000 fois le même update.

Je me demandais si j'avais un moyen de créer une sorte de table en
mémoire qui permettrait de "résumer":

trois critères:
Dom_id
Date_Start
Date_End

et des données:
mails_total
mails_rbl
MO_received
MO_blocked

qui me sortirait a la fin un

Dom_id5
Date_Start="2015-04-15 01:00:00"
Date_End="2015-04-15 01:59:59";
mails_total5
mails_rbl5
MO_received".75
MO_blocked".75

Dom_id5
Date_Start="2015-04-15 02:00:00"
Date_End="2015-04-15 02:59:59";
mails_total‚
mails_rbl‚
MO_receivedS.30
MO_blockedS.30



Tu crées une table de hashage avec comme clé la contaténation des trois
critères, ainsi tu n'auras plus de doublon :

my %tmp_db;
my $dom = 105;
my $start = "2015-04-15 01:00:00";
my $end = "2015-04-15 01:59:59";
my $k = "$dom,$start,$end";
$tmp_db{$k}{mails_total} = 35;
# ...

for my $k (keys %tmp_db) {
my ($dom, $start, $end) = split /,/, $k;
my $mails_total = $tmp_db{$k}{mails_total};
# ...
# envoi de la requête pour cette clé
}

Bien évidemment, il faut trouver un séparateur qui n'apparait dans aucun
des trois champs.

--
Benoit Izac
espie
Le #26349281
In article
Bonjour,

le 15/04/2015 à 07:14, Chloe Sival a écrit dans le message

J'ai un script perl qui va mettre a jour une table MySQL, il envoi des:

UPDATE STATS_Summary_Hourly SET



mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET



mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET



mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";

UPDATE STATS_Summary_Hourly SET



mails_total=(mails_total+1),mails_rbl=(mails_rbl+1),MO_received=(MO_received+650),MO_blocked=(MO_blocked+0.650)
WHERE dom_id5 AND Date_Start="2015-04-15 01:00:00" AND
Date_End="2015-04-15 01:59:59";


Mon soucis est qu'il exécute 5000 fois le même update.

Je me demandais si j'avais un moyen de créer une sorte de table en
mémoire qui permettrait de "résumer":

trois critères:
Dom_id
Date_Start
Date_End

et des données:
mails_total
mails_rbl
MO_received
MO_blocked

qui me sortirait a la fin un

Dom_id5
Date_Start="2015-04-15 01:00:00"
Date_End="2015-04-15 01:59:59";
mails_total5
mails_rbl5
MO_received".75
MO_blocked".75

Dom_id5
Date_Start="2015-04-15 02:00:00"
Date_End="2015-04-15 02:59:59";
mails_total‚
mails_rbl‚
MO_receivedS.30
MO_blockedS.30



Tu crées une table de hashage avec comme clé la contaténation des trois
critères, ainsi tu n'auras plus de doublon :

my %tmp_db;
my $dom = 105;
my $start = "2015-04-15 01:00:00";
my $end = "2015-04-15 01:59:59";
my $k = "$dom,$start,$end";
$tmp_db{$k}{mails_total} = 35;
# ...

for my $k (keys %tmp_db) {
my ($dom, $start, $end) = split /,/, $k;
my $mails_total = $tmp_db{$k}{mails_total};
# ...
# envoi de la requête pour cette clé
}

Bien évidemment, il faut trouver un séparateur qui n'apparait dans aucun
des trois champs.



Pourquoi faire ? on est en 2015, tous les perl existants font de
l'autovivification, et avoir un hash a 3 niveaux est raisonnablement simple.
Paul Gaborit
Le #26349292
À (at) Wed, 15 Apr 2015 09:50:15 +0200,
Benoit Izac [...]
Tu crées une table de hashage avec comme clé la contaténation des trois
critères, ainsi tu n'auras plus de doublon :


[... snip le code ...]

Votre boule de cristal semble en meilleur état que la mienne pour
réussir à comprendre la demande initiale. Il faut que je l'amène en
révision.

--
Paul Gaborit - Perl en français -
Benoit Izac
Le #26349323
Bonjour,

le 15/04/2015 à 15:03, Marc Espie a écrit dans le message

Tu crées une table de hashage avec comme clé la contaténation des trois
critères, ainsi tu n'auras plus de doublon :

my %tmp_db;
my $dom = 105;
my $start = "2015-04-15 01:00:00";
my $end = "2015-04-15 01:59:59";
my $k = "$dom,$start,$end";
$tmp_db{$k}{mails_total} = 35;
# ...

for my $k (keys %tmp_db) {
my ($dom, $start, $end) = split /,/, $k;
my $mails_total = $tmp_db{$k}{mails_total};
# ...
# envoi de la requête pour cette clé
}

Bien évidemment, il faut trouver un séparateur qui n'apparait dans aucun
des trois champs.



Pourquoi faire ? on est en 2015, tous les perl existants font de
l'autovivification, et avoir un hash a 3 niveaux est raisonnablement
simple.



Donc tu proposes :

my %tmp_db;
my $dom = 105;
my $start = "2015-04-15 01:00:00";
my $end = "2015-04-15 01:59:59";
$tmp_db{$dom}{$start}{$end}{mails_total} = 35;
# ...

for my $dom (keys %tmp_db) {
for my $start (keys %{$tmp_db{$dom}}) {
for my $end (keys %{$tmp_db{$dom}{$start}}) {
my $mails_total = $tmp_db{$dom}{$start}{$end}{mails_total};
# ...
}
}
}

C'est bien cela ?

--
Benoit Izac
Benoit Izac
Le #26349325
Bonjour,

le 15/04/2015 à 16:50, Paul Gaborit a écrit dans le message

Tu crées une table de hashage avec comme clé la contaténation des trois
critères, ainsi tu n'auras plus de doublon :


[... snip le code ...]

Votre boule de cristal semble en meilleur état que la mienne pour
réussir à comprendre la demande initiale. Il faut que je l'amène en
révision.



La seule chos que j'ai compris, c'est qu'elle veut éviter d'envoyer la
même requête SQL un grand nombre de fois et qu'elle souhaiterai donc
stocker dans une base de donnée "temporaire" (je le comprends comme "en
mémoire") avant d'envoyer les requêtes nécessaires à la mise à jour de
la base SQL.

Je ne comprends pas non plus le pourquoi du comment de ces 5000 répétitions
et je trouve ça également surprenant si ça peut rassurer sur le mauvais
état de la sphère divine.

--
Benoit Izac
Publicité
Poster une réponse
Anonyme