Bonjour à tous,

Débutant sous perl, j'essaye d'optimiser un script car celui-ci prend trop de temps à mon goût ^^
Soit car il n'est pas possible de faire autrement soit car il y a un problème de conception...

Le script actuel lit un fichier de 1 millions de lignes voir 3, ligne à ligne, et exécute une série de tests sur des données (une BDD extraite dans un hash à plusieurs dimensions mit dans un module généré à partir d'un awk, car je me suis dit que cela serait plus rapide que de faire 36 millions de requêtes vers Mysql)

Ex du hash: (le vrai contient plus de 200 ID1, qui contiennent chacun en général une 20aine d'ID2, qui eux même contiennent bien souvent plus de 300 CODE)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
our %bdd =      (
 
                150230 =>    #ID1
                        {
                                360789 => #ID2
                                        {
                                                123456 => #CODE
                                                        {
                                                                 infos1 => 'du texte',
                                                                 infos2 => ['a','b','c']
                                                        },
                                        }
                         }
                      );
Pour accéder aux clefs du hash que je souhaite utilisé selon la ligne dans ma boucle while (<>) je fais:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
       for my $code ( keys %{$bdd{$ID1_FICHIER}{$ID2_FICHIER}} )
        {
        }
$ID1_FICHIER et $ID2_FICHIER correspondant aux ID récupéré dans les champs de mon fichier

Le parcours se fait sans encombre et c'est super rapide. Si je fais aucun test dans ma boucle sur le contenu des clefs du code parcouru en cours ,le temps d'exécution est super rapide (2min pour 1.5 millions de lignes).

Par contre dès lors que je fais un test du genre, le temps d'exécution augmente énormément:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
       if($bdd{$ID1_FICHIER}{$ID_FICHIER2}{$code}{info1} eq 'du blabla')
       {
       }
J'ai aussi tenté de créer une référence sur ce code juste au début de mon 'for' et de l'utiliser dans ma condition, mais le temps de créer la référence + faire le test augmente encore un peu le temps d'execution ^^

Je voulais donc tester de créer un hash pour chaque code contenant les infos genre:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
%hash_code_25689 = (
                               info1 => 'du texte'
                              )
Mais je n'arrive pas à trouver l'astuce qui ferais que si j'avais $code=25869, je pourrais accéder à mon hash genre:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
print $hash_code_${256869};
Y'a t'il un moyen de procéder comme ceci? et cela améliora t'il à votre avis le temps d'accès aux infos pour faire mes test?

Ou avez-vous d'autres idées qui pourrait m'aider à améliorer les performances de tout ca? , car je comprends bien que d'ajouter un test dans ma boucle augmente le temps mais delà à passer de 2min à plus de 15min juste pour faire un if $tata eq 'bob' me parait un peu bizzard , non?

Merci pour vos compléments d'information

Cdt,