Bonjour,
Je suis entrain de développer un script Perl dans le cadre de mon boulot, et j'ai besoin de conseil pour optimiser une partie du traitement.
Environnement:
J'ai 5 fichiers à lire, puis à analyser (ligne par ligne). La taille de ces fichiers est variables, pouvant aller de dizaine de ko à plusieurs dizaines, voir centaines de Mo.
Ces fichiers ont une structure identique, c.à.d qu'ils sont composés de lignes de 48 caractères.
L'analyse de ces fichiers n'est pas continu, c'est à dire que je dois analyser N lignes une 1ere fois, puis M lignes une 2nde, etc.. jusqu’à la fin du fichier
Objectif
Je dois lire 1 ligne de chaque fichier, et pour chaque ligne je dois:
- retourner la ligne
- effacer tous les espaces et le retour chariot
- concaténer les 5 lignes ensemble (au fur et à mesure)
Méthode
J'ai choisis de faire la fonction suivante:
Problème
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 sub extract_acq_data { my $data = q{}; my $flag_nodata = 0; for ( 0..4) { my $rd_data = readline( $fh_acq[$_] ); if ( defined( $rd_data )) { $data .= reverse($rd_data); } else { $flag_nodata = 1; last; } } # Return data only if flag nodata is reset if ( $flag_nodata == 0 ) { $data =~ s/\s+//g; return $data; } else { return -1; } }
Mon souci, vient du faite de la "lenteur" de cette fonction.
En effet, j'ai 'profilé' mon script avec 5 fichiers de 300Mo (~7.5M lignes chacun), et j'obtiens les infos suivantes:
Exécution du script : 19s
Exécution de la fonction : 16s
avec
- readline : 2.68s
- if ( defined... : 2.41s
- remove space (s/[[:space:]]) : 3.34s
Donc ma question, est-il possible, et si oui, comment je pourrais optimiser cette fonction pour réduire le temps d’exécution du script?
Merci
Partager