OVH Cloud OVH Cloud

Lenteur de mon pgm

5 réponses
Avatar
Yann Leguen
Bonjour,
Je fais actuellement un programme qui permet de récupérer dans une liste un
element d'aprés un element de la ligne (...)
je m'explique :

mon fichier :(Une 100 de Kb soit environ 1000 lignes)
XX ELT_A_RECUPERER 3145 2439 2484
XXXXXXXXXXXXXX
XX ELT_A_RECUPERER 2412 1439 2484
XXXXXXXXXXXXXX
XX ELT_A_RECUPERER 515 251 2484
XXXXXXXXXXXXXX
XX ELT_A_RECUPERER 251 2439 2484
XXXXXXXXXXXXXX
...
XX ELT_A_RECUPERER 25 2439 2484
XXXXXXXXXXXXXX


Mon programme:
$monfic="C:\mon fichier.txt";

$var=500;

open (FIC,"$monfic") || die "je ne peux ouvrir $monfic";
while (<FIC>)
{
if (/[0-9]/) # Recherche de chiffre
{
$line = $_;
}
open (FIC2,">$fic_temp");
print FIC2 ("$line");
close FIC2;
$recuperation = `grep "[0-9]" "$fic_temp" | cut -c25-28 | sed "s/ //g"`;
#Récupération du 1er groupe de chiffre
chomp $recuperation;
if ($recuperation >= $var) # Si le groupe est > à 500, alors je copie
la ligne
{
open (FIC2,">>C:\\Perl\\DEV\\SUP_A_500.txt");
print FIC2 ("$line");
close FIC2;
}
elsif ($recuperation < $var) # Si le groupe est < à 500, alors je copie
la ligne mais dans un autre fichier....

{
open (FIC2,">>C:\\Perl\\DEV\\INF_A_500.txt");
print FIC2 ("$line");
close FIC2;
chomp $recuperation;

}
}
close (FIC) || die "je ne peux pas fermer $monfic";

=========================================================

Voila, mon programme marche bien, le seul probleme, c'est qu'il est trés
lent. (En effet, j'écrit beaucoup -Mais
l'écriture est la science de l'ane-)
Existe - t'il une solution pour aller plus vite (fichier temporaire, ...)
Merci de votre aide, car là je seche .

Yann


--
"Connaître son ignorance est la meilleure part de la connaissance"

5 réponses

Avatar
Paul Gaborit
À (at) Mon, 23 Oct 2006 22:25:42 +0200,
"Yann Leguen" écrivait (wrote):
Bonjour,
Je fais actuellement un programme qui permet de récupérer dans une liste un
element d'aprés un element de la ligne (...)
[...]

Voila, mon programme marche bien, le seul probleme, c'est qu'il est
trés lent. (En effet, j'écrit beaucoup -Mais l'écriture est la
science de l'ane-) Existe - t'il une solution pour aller plus vite
(fichier temporaire, ...) Merci de votre aide, car là je seche .


Votre programme est lent parce que :
1- vous passez par un fichier temporaire alors qu'il me semble que
c'est inutile.
2- vous ouvrez et refermez vos fichiers à chaque écriture alors qu'il
suffirait de les ouvrir une bonne fois pour toutes au début.
3- vous faites appel à des programmes externes (sed, cut...) alors que
Perl sait faire beaucoup mieux.

Décrivez donc votre besoin réel :
- comment faire pour repérer une ligne intéressante ?
- où est l'information discriminante dans la ligne ?
- dans quel(s) fichier(s) une ligne intéressante doit-elle être écrite ?
et nous pourrons vous donner des pistes pour écrire votre programme
efficacement.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Yann Leguen
Merci de la réponse. En partie elle m'aide dans le cas de l'ouverture des
fichiers (...)
En ce qui concerne sed et cut, je n'ai que peu d'alternative . Il y a
"split" mais mon
fichier ne me le permet pas (je penses) .

voici le fichier que j'ai à traiter, l'information qui me permettra
d'extraire la donnée .

le fichier.txt contient les informations suivantes:

AA nom1 1234 5678 9012
AB lenom2 1235 6789 9016
AA nomnumero3 3451 1548 5684
BB nom4 251 5684 66

Je dois extraire le "nom" en fonction du 1er groupe de chiffre. (disons si
le nombre est > à 100)

Etant donné que le nombre d'espace entre "le nom" et le 1er groupe de
chiffre est variable
(Lié à la longueur du nom) j'utilise la commande cut -c24-30 pour ne garder
que le 1er groupe
de chiffre.

Si le groupe est > à 100 (par exemple ;-) alors je récupère "le nom" dans un
fichier X, Si le
1er groupe est < à 100, alors je récupère également "le nom" mais dans un
fichier Y que je traiterai
ultérieurement.

Dans ma logique, j'écris d'abord toute la ligne dans un fichier temporaire
(que j'écrase à chaque nouvelle écriture)
AA nom1 1234 5678 9012
Je récupère le 1er groupe de chiffre (1234)
Il est > à 100 alors je récupère "nom1" dans un fichier.
et je recommence jusqu'à ce que j'ai traité toutes les lignes de mon fichier
(qui en comporte environ 1000)

Voilà, j'espère avoir été clair. Dans tous les cas, le fait (effectivement)
d'ouvrir mes fichiers avant me fait
déjà gagné un peu de temps. Merci pour ce tuyau.

Dans l'attente de vous relire.

Yann



--
"Connaître son ignorance est la meilleure part de la connaissance"
"Paul Gaborit" a écrit dans le message de
news:

À (at) Mon, 23 Oct 2006 22:25:42 +0200,
"Yann Leguen" écrivait (wrote):
Bonjour,
Je fais actuellement un programme qui permet de récupérer dans une liste
un
element d'aprés un element de la ligne (...)
[...]

Voila, mon programme marche bien, le seul probleme, c'est qu'il est
trés lent. (En effet, j'écrit beaucoup -Mais l'écriture est la
science de l'ane-) Existe - t'il une solution pour aller plus vite
(fichier temporaire, ...) Merci de votre aide, car là je seche .


Votre programme est lent parce que :
1- vous passez par un fichier temporaire alors qu'il me semble que
c'est inutile.
2- vous ouvrez et refermez vos fichiers à chaque écriture alors qu'il
suffirait de les ouvrir une bonne fois pour toutes au début.
3- vous faites appel à des programmes externes (sed, cut...) alors que
Perl sait faire beaucoup mieux.

Décrivez donc votre besoin réel :
- comment faire pour repérer une ligne intéressante ?
- où est l'information discriminante dans la ligne ?
- dans quel(s) fichier(s) une ligne intéressante doit-elle être écrite ?
et nous pourrons vous donner des pistes pour écrire votre programme
efficacement.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>



Avatar
kotori
Merci de la réponse. En partie elle m'aide dans le cas de l'ouverture des
fichiers (...)
En ce qui concerne sed et cut, je n'ai que peu d'alternative . Il y a
"split" mais mon
fichier ne me le permet pas (je penses) .

voici le fichier que j'ai à traiter, l'information qui me permettra
d'extraire la donnée .

le fichier.txt contient les informations suivantes:

AA nom1 1234 5678 9012
AB lenom2 1235 6789 9016
AA nomnumero3 3451 1548 5684
BB nom4 251 5684 66

Je dois extraire le "nom" en fonction du 1er groupe de chiffre. (disons si
le nombre est > à 100)

Etant donné que le nombre d'espace entre "le nom" et le 1er groupe de
chiffre est variable
(Lié à la longueur du nom) j'utilise la commande cut -c24-30 pour ne garder
que le 1er groupe
de chiffre.

Si le groupe est > à 100 (par exemple ;-) alors je récupère "le nom" dans un
fichier X, Si le
1er groupe est < à 100, alors je récupère également "le nom" mais dans un
fichier Y que je traiterai
ultérieurement.

Dans ma logique, j'écris d'abord toute la ligne dans un fichier temporaire
(que j'écrase à chaque nouvelle écriture)
AA nom1 1234 5678 9012
Je récupère le 1er groupe de chiffre (1234)
Il est > à 100 alors je récupère "nom1" dans un fichier.
et je recommence jusqu'à ce que j'ai traité toutes les lignes de mon fichier
(qui en comporte environ 1000)

Voilà, j'espère avoir été clair. Dans tous les cas, le fait (effectivement)
d'ouvrir mes fichiers avant me fait
déjà gagné un peu de temps. Merci pour ce tuyau.

Dans l'attente de vous relire.

Yann





une simple regex et deux if suffisent :)
/^w+s(D+)s+(d)sdsd/





$monfic="C:mon fichier.txt";
$varP0;
open (FIC,"$monfic") || die "je ne peux ouvrir $monfic";
open (FIC1,">$fic_temp");
open (FIC2,">>C:PerlDEVSUP_A_500.txt");
foreachmy $ligne (<FIC>) {
my ( $nom , $nombre) = /^w+s(D+)s+(d)sdsd/g ;
print FIC1 $nom if ( $nombre > 500 ) ;
print FIC2 $nom if ( $nombre > 500 ) ;
}
close(FIC2);
close(FIC1);
close(FIC);

Avatar
Mark Clements
kotori wrote:
Merci de la réponse. En partie elle m'aide dans le cas de l'ouverture
des fichiers (...)
En ce qui concerne sed et cut, je n'ai que peu d'alternative . Il y a
"split" mais mon
fichier ne me le permet pas (je penses) .

voici le fichier que j'ai à traiter, l'information qui me permettra
d'extraire la donnée .

le fichier.txt contient les informations suivantes:

AA nom1 1234 5678 9012
AB lenom2 1235 6789 9016
AA nomnumero3 3451 1548 5684
BB nom4 251 5684 66

Je dois extraire le "nom" en fonction du 1er groupe de chiffre.
(disons si le nombre est > à 100)

Etant donné que le nombre d'espace entre "le nom" et le 1er groupe de
chiffre est variable
(Lié à la longueur du nom) j'utilise la commande cut -c24-30 pour ne
garder que le 1er groupe
de chiffre.

Si le groupe est > à 100 (par exemple ;-) alors je récupère "le nom"
dans un fichier X, Si le
1er groupe est < à 100, alors je récupère également "le nom" mais dans
un fichier Y que je traiterai
ultérieurement.

Dans ma logique, j'écris d'abord toute la ligne dans un fichier
temporaire (que j'écrase à chaque nouvelle écriture)
AA nom1 1234 5678 9012
Je récupère le 1er groupe de chiffre (1234)
Il est > à 100 alors je récupère "nom1" dans un fichier.
et je recommence jusqu'à ce que j'ai traité toutes les lignes de mon
fichier (qui en comporte environ 1000)

Voilà, j'espère avoir été clair. Dans tous les cas, le fait
(effectivement) d'ouvrir mes fichiers avant me fait
déjà gagné un peu de temps. Merci pour ce tuyau.

Dans l'attente de vous relire.

Yann





une simple regex et deux if suffisent :)
/^w+s(D+)s+(d)sdsd/

(d) n'est pas correct - il va matcher une seule chiffre.


/^w+s(D+)s+(d+)sd+sd+/

Mais: si le format est de champs de largeur fixé, souvent unpack est
mieux. Il marche même s'il y a un champs vide, et il se peut qu'il soit
plus rapide.

eg

my @champs = unpack ("A2 A10 A6 A6", $ligne);

(je divine les nombres ici parce que je ne connais pas le format de
fichier exact).

Mark


Avatar
Yann Leguen
Merci pour les infos. Je me suis plongé dans les RegEx et effectivement,
j'ai trouvé mon bonheur.
Merci encore.

Yann

--
"Connaître son ignorance est la meilleure part de la connaissance"
"Mark Clements" a écrit dans le message
de news: 453f727b$0$27377$
kotori wrote:
Merci de la réponse. En partie elle m'aide dans le cas de l'ouverture
des fichiers (...)
En ce qui concerne sed et cut, je n'ai que peu d'alternative . Il y a
"split" mais mon
fichier ne me le permet pas (je penses) .

voici le fichier que j'ai à traiter, l'information qui me permettra
d'extraire la donnée .

le fichier.txt contient les informations suivantes:

AA nom1 1234 5678 9012
AB lenom2 1235 6789 9016
AA nomnumero3 3451 1548 5684
BB nom4 251 5684 66

Je dois extraire le "nom" en fonction du 1er groupe de chiffre. (disons
si le nombre est > à 100)

Etant donné que le nombre d'espace entre "le nom" et le 1er groupe de
chiffre est variable
(Lié à la longueur du nom) j'utilise la commande cut -c24-30 pour ne
garder que le 1er groupe
de chiffre.

Si le groupe est > à 100 (par exemple ;-) alors je récupère "le nom"
dans un fichier X, Si le
1er groupe est < à 100, alors je récupère également "le nom" mais dans
un fichier Y que je traiterai
ultérieurement.

Dans ma logique, j'écris d'abord toute la ligne dans un fichier
temporaire (que j'écrase à chaque nouvelle écriture)
AA nom1 1234 5678 9012
Je récupère le 1er groupe de chiffre (1234)
Il est > à 100 alors je récupère "nom1" dans un fichier.
et je recommence jusqu'à ce que j'ai traité toutes les lignes de mon
fichier (qui en comporte environ 1000)

Voilà, j'espère avoir été clair. Dans tous les cas, le fait
(effectivement) d'ouvrir mes fichiers avant me fait
déjà gagné un peu de temps. Merci pour ce tuyau.

Dans l'attente de vous relire.

Yann





une simple regex et deux if suffisent :)
/^w+s(D+)s+(d)sdsd/

(d) n'est pas correct - il va matcher une seule chiffre.


/^w+s(D+)s+(d+)sd+sd+/

Mais: si le format est de champs de largeur fixé, souvent unpack est
mieux. Il marche même s'il y a un champs vide, et il se peut qu'il soit
plus rapide.

eg

my @champs = unpack ("A2 A10 A6 A6", $ligne);

(je divine les nombres ici parce que je ne connais pas le format de
fichier exact).

Mark