J'ai un script Perl, qui analyse le fichier de données et écrit 5 fichiers de sortie remplis de grille 1100 x 1300. Le script fonctionne, mais à mon avis, c'est maladroit et probablement inefficace. Le script est aussi du code hérité, que j'ai modifié un peu pour le rendre plus lisible. Pourtant, c'est un gâchis. À l'heure actuelle, le script lit le fichier de données (~ 4 Mo) et le place dans un tableau. Ensuite, il parcourt le tableau en analysant son contenu et en poussant les valeurs vers un autre tableau, puis en les imprimant dans un autre fichier. Si la valeur n'est pas trouvée pour un certain point, elle imprime 9999. Le zéro est une valeur acceptable.Comment remplir une grille N x M efficacement avec Perl?
Le fichier de données a 5 paramètres différents et chacun d'eux est écrit dans son propre fichier.
Exemple de données:
data for the param: 2
5559
// (x,y) count values
280 40 3 0 0 0
280 41 4 0 0 0 0
280 42 5 0 0 0 0 0
281 43 4 0 0 10 10
281 44 4 0 0 10 10
281 45 4 0 0 0 10
281 46 4 0 0 10 0
281 47 4 0 0 10 0
281 48 3 10 10 0
281 49 2 0 0
41 50 3 0 0 0
45 50 3 0 0 0
280 50 2 0 0
40 51 8 0 0 0 0 0 0 0 0
...
data for the param: 3
3356
// (x,y) count values
est le nombre de lignes de données pour le paramètre en cours. Ligne de données va: x, y, nombre de valeurs x consécutives pour ce point particulier et enfin les valeurs . Il y a une ligne vide entre les paramètres. Comme je l'ai dit plus tôt, le script fonctionne, mais je pense que cela pourrait être fait beaucoup plus facilement et plus efficacement. Je ne sais pas comment. Alors, voici une chance pour l'auto-amélioration.
Quelle serait une meilleure approche de ce problème, qu'une combinaison compliquée de tableaux et de boucles?
EDIT:
aurait dû être plus clair à ce sujet, désolé.
La sortie est une grille de 1100 x 1300 remplie de valeurs lues dans le fichier de données. Chaque paramètre est écrit dans un fichier différent. Plus d'une valeur sur la ligne de données signifie que cette ligne contient des données pour x (+ n), y points.
MISE À JOUR:
J'ai testé la solution et à ma grande surprise, il était plus lent que script original (~ 3 secondes). Cependant, le script est environ 50% plus petit, ce qui facilite beaucoup la compréhension du script. Dans ce cas, c'est plus important qu'un gain de vitesse de 3 secondes.
Voici une partie du code de l'ancien script. J'espère que vous aurez l'idée de base. Pourquoi est-ce plus rapide?
for my $i (0..$#indata) { # Data file is read to @indata
...
if($indata[$i] =~ /^data for the param:/) {
push @block, $i; # data borders aka. lines, where block starts and ends
}
...
}
# Then handle the data blocks
for my $k (0..4) { # 5 parameters
...
if($k eq '4') { # Last parameter
$enddata = $#indata;
}
else {
$enddata = $block[$k+1];
}
...
for my $p ($block[$k]..$enddata) { # from current block to next block
...
# Fill data array
for(my $m=0 ; $m<$n ; $m++){
$data[$x][$y] = $values[$m];
}
}
print2file();
}
Serait-il possible de publier une partie de votre code ici? La partie qui fait au moins le traitement que vous décrivez? – Sagar
En outre, vous ne décrivez pas exactement ce que vous voulez dans les fichiers de sortie! Quelle est la signification des valeurs multiples par coordonnée dans ce contexte? Décrire votre contribution, mais pas ce que vous voulez accomplir est assez inutile pour une question. – tsee