Discussion:
Base de donnée temporaire dans Perl ?
(trop ancien pour répondre)
Chloe Sival
2015-04-15 05:14:41 UTC
Permalink
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_id=105 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_id=105 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_id=105 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_id=105 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_id=105
Date_Start="2015-04-15 01:00:00"
Date_End="2015-04-15 01:59:59";
mails_total=35
mails_rbl=35
MO_received=22.75
MO_blocked=22.75

Dom_id=105
Date_Start="2015-04-15 02:00:00"
Date_End="2015-04-15 02:59:59";
mails_total=82
mails_rbl=82
MO_received=53.30
MO_blocked=53.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
Benoit Izac
2015-04-15 07:50:15 UTC
Permalink
Bonjour,

le 15/04/2015 à 07:14, Chloe Sival a écrit dans le message
Post by Chloe Sival
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_id=105 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_id=105 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_id=105 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_id=105 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
Dom_id
Date_Start
Date_End
mails_total
mails_rbl
MO_received
MO_blocked
qui me sortirait a la fin un
Dom_id=105
Date_Start="2015-04-15 01:00:00"
Date_End="2015-04-15 01:59:59";
mails_total=35
mails_rbl=35
MO_received=22.75
MO_blocked=22.75
Dom_id=105
Date_Start="2015-04-15 02:00:00"
Date_End="2015-04-15 02:59:59";
mails_total=82
mails_rbl=82
MO_received=53.30
MO_blocked=53.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
Marc Espie
2015-04-15 13:03:58 UTC
Permalink
Post by Chloe Sival
Bonjour,
le 15/04/2015 à 07:14, Chloe Sival a écrit dans le message
Post by Chloe Sival
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)
Post by Chloe Sival
WHERE dom_id=105 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)
Post by Chloe Sival
WHERE dom_id=105 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)
Post by Chloe Sival
WHERE dom_id=105 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)
Post by Chloe Sival
WHERE dom_id=105 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
Dom_id
Date_Start
Date_End
mails_total
mails_rbl
MO_received
MO_blocked
qui me sortirait a la fin un
Dom_id=105
Date_Start="2015-04-15 01:00:00"
Date_End="2015-04-15 01:59:59";
mails_total=35
mails_rbl=35
MO_received=22.75
MO_blocked=22.75
Dom_id=105
Date_Start="2015-04-15 02:00:00"
Date_End="2015-04-15 02:59:59";
mails_total=82
mails_rbl=82
MO_received=53.30
MO_blocked=53.30
Tu crées une table de hashage avec comme clé la contaténation des trois
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.
Benoit Izac
2015-04-15 19:26:48 UTC
Permalink
Bonjour,

le 15/04/2015 à 15:03, Marc Espie a écrit dans le message
Post by Marc Espie
Post by Benoit Izac
Tu crées une table de hashage avec comme clé la contaténation des trois
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
Paul Gaborit
2015-04-15 14:50:02 UTC
Permalink
À (at) Wed, 15 Apr 2015 09:50:15 +0200,
Benoit Izac <***@INVALID.ADDRESS> écrivait (wrote):
[...]
Post by Benoit Izac
Tu crées une table de hashage avec comme clé la contaténation des trois
[... 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 - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Benoit Izac
2015-04-15 19:43:02 UTC
Permalink
Bonjour,

le 15/04/2015 à 16:50, Paul Gaborit a écrit dans le message
Post by Paul Gaborit
Post by Benoit Izac
Tu crées une table de hashage avec comme clé la contaténation des trois
[... 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
Paul Gaborit
2015-04-15 07:11:35 UTC
Permalink
À (at) Wed, 15 Apr 2015 07:14:41 +0200,
[...]
Post by Chloe Sival
Mon soucis est qu'il exécute 5000 fois le même update.
[...]
Post by Chloe Sival
Je me demandais si j'avais un moyen de créer une sorte de table en
[...]
Post by Chloe Sival
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 - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Loading...