Bonjour,
J'ai un fichier $DEST_DIR/$tmp_filename1 qui a des lignes au format suivant :
timestamp|field1|field2|field3|.......|field48
timestamp'|field1'|field2'|......|field48'
Le timestamp est en format epoch (chaque timestamp représente une minute particulière durant une date quelconque) et les field1 à field48 ce sont des valeurs numériques >= 0.
Je veux faire un contrôle sur ce fichier pour trouver les timestamps manquants et insérer une ligne bidon du genre :
timestamp_manquant|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1
dans un ordre temporel croissant dans le fichier (pour avoir en final un fichier avec 1440 lignes qui représente les 1440 minutes d'une journée).
Donc j'ai une variable $debut ou est stocké la première minute d'une journée particulière en epoch (journée 00:00:00). Et une variable $LAST_TIMESTAMP1 qui stocke le dernier timestamp présent dans le fichier $DEST_DIR/$tmp_filename1
J'ai fait le code suivant qui fait l'affaire :
Le code marche bien mais je trouve qu'il prend beaucoup de temps à s'exécuter vu le contrôle systématique qu'il fait par minute de la journée. Il n'y a t-il pas moyen d'optimiser plus ce code là ou une autre manière plus rapide pour avoir le résultat escompté ?
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
16
17
18
19
20
21
22 if ($LAST_TIMESTAMP1 != $debut) { my $iterdeb11 = ($LAST_TIMESTAMP1 - $debut) / 60; for (my $j1=1; $j1 <= $iterdeb11; $j1++) { my $curtimestamp11 = $debut + (($j1 - 1)*60); my $checking1 = `/bin/grep \'\^$curtimestamp11\' $DEST_DIR/$tmp_filename1`; if ($checking1 == "") { my $lineadded1 = $curtimestamp11."|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1\n"; my $adding1 = `/usr/bin/perl -pi -e \'print \"$lineadded1\" if \$. == $j1\' $DEST_DIR/$tmp_filename1`; } } } if ($LAST_TIMESTAMP1 != $fin) { open(TMP_OUTPUT11,'>>',"$DEST_DIR/$tmp_filename1") or die $!; my $iterdeb12 = ($fin - $LAST_TIMESTAMP1) / 60; for (my $c1=1; $c1 <= $iterdeb12; $c1++) { my $curtimestamp12 = $LAST_TIMESTAMP1 + ($c1*60); print TMP_OUTPUT11 $curtimestamp12."|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1\n"; } close(TMP_OUTPUT11); }
Pour une plus d'optimisation je peux ajouter une boucle unless qui exécutera le code attaché seulement et seulement si le nombre de lignes du dit fichier est inférieur strictement à 1440 (sachant que deux lignes différentes ne peuvent pas avoir le même timestamp).
Merci d'avance,
Partager