...devient vite une usine a gaz surtout quand vous rechercher dans un
fichier de plusieurs milliers de lignes une centaine d'occurences
différentes.
J'ai pensé mettre mes différentes occurences dans un tableau mais je ne vois
pas comment rechercher par la suite.
Mon deuxieme souci est le temps d'execution et l'utilisation CPU/ RAM.
Je suis preneur de toutes idées et/ou direction possible.
Par contre je préfere le script1 pour des raisons pratiques , en travaillant avec une liste de liste je peux travailler ET sur le moteur ET sur les mots-clés alors qu'avec le script2 c soit l'un soit l'autre...
C'est quoi les mots clefs ?
N'y a t-il pas moyen d'optimiser le script1 ?
Toujours pas compris pourquoi vous aviez besoin de regexp. Enfin, vous pourriez déjà les précompiler au lieu de les recompiler à chaque usage.
Fabrice L. <rafale@altern.org> écrit:
Par contre je préfere le script1 pour des raisons pratiques , en travaillant
avec une liste de liste je peux travailler ET sur le moteur ET sur les
mots-clés alors qu'avec le script2 c soit l'un soit l'autre...
C'est quoi les mots clefs ?
N'y a t-il pas moyen d'optimiser le script1 ?
Toujours pas compris pourquoi vous aviez besoin de regexp. Enfin,
vous pourriez déjà les précompiler au lieu de les recompiler à chaque
usage.
Par contre je préfere le script1 pour des raisons pratiques , en travaillant avec une liste de liste je peux travailler ET sur le moteur ET sur les mots-clés alors qu'avec le script2 c soit l'un soit l'autre...
C'est quoi les mots clefs ?
N'y a t-il pas moyen d'optimiser le script1 ?
Toujours pas compris pourquoi vous aviez besoin de regexp. Enfin, vous pourriez déjà les précompiler au lieu de les recompiler à chaque usage.
Fabrice L.
Toujours pas compris pourquoi vous aviez besoin de regexp. Enfin, vous pourriez déjà les précompiler au lieu de les recompiler à chaque usage.
c a d ?
Fabrice
Toujours pas compris pourquoi vous aviez besoin de regexp. Enfin,
vous pourriez déjà les précompiler au lieu de les recompiler à chaque
usage.
Le fait qu'il y ait des points dans vos noms à rechercher peuvent expliquer le temps d'exécution. Utilisez plutôt :
if ($elements[9] =~ /Q$liste_moteurs[$_][0]E/)
Le Q et le E encadre un bout de texte pour lequel vous ne voulez pas que les méta-caractères des regexp soient actifs.
Mais, quitte à effectuer une recherche pour chaque moteur, utilisez plutôt 'index' :
if (index($elements[9], $liste_moteurs[$_][0]) >= 0)
Dans votre cas, l'usage d'une expression régulière n'est intéressante que si vous faites tout d'un seul coup... et si elle est optimisée (*).
[...]
ce script la est tres lent avec quasi 100% d'utilisation CPU (10/12sec. ) sur un fichier de 18000 lignes ( c vrai que pour chaque ligne il faut tester les 200 moteurs) alors que ... [...]
Remplacez les '.' dans vos regexp par '.' et vous aurez le même temps d'exécution que le script1.
[...]
Par contre je préfere le script1 pour des raisons pratiques , en travaillant avec une liste de liste je peux travailler ET sur le moteur ET sur les mots-clés alors qu'avec le script2 c soit l'un soit l'autre...
N'y a t-il pas moyen d'optimiser le script1 ?
Utilisez Q et E ou mieux 'index'.
(*) une autre raison qui pourrait vous faire préférer les expressions régulières seraient l'usage du modificateur /i (insensible à la casse) pour éviter les multiples recherches de "google", "googLE" et autres "GOOGLE". Mais là encore, 'index' peut rester meilleur si vous prenez la peine de passer votre chaîne dans la fonction lc() au préalable.
-- Paul Gaborit - <http://www.enstimac.fr/~gaborit/> Perl en français - <http://www.enstimac.fr/Perl/>
À (at) Tue, 22 Jun 2004 17:27:21 +0200,
"Fabrice L." <rafale@altern.org> écrivait (wrote):
Par contre, parmi toutes les methodes testées
[...]
Le fait qu'il y ait des points dans vos noms à rechercher peuvent expliquer le
temps d'exécution. Utilisez plutôt :
if ($elements[9] =~ /Q$liste_moteurs[$_][0]E/)
Le Q et le E encadre un bout de texte pour lequel vous ne voulez pas que les
méta-caractères des regexp soient actifs.
Mais, quitte à effectuer une recherche pour chaque moteur, utilisez plutôt
'index' :
if (index($elements[9], $liste_moteurs[$_][0]) >= 0)
Dans votre cas, l'usage d'une expression régulière n'est intéressante que si
vous faites tout d'un seul coup... et si elle est optimisée (*).
[...]
ce script la est tres lent avec quasi 100% d'utilisation CPU (10/12sec. )
sur un fichier de 18000 lignes ( c vrai que pour chaque ligne il faut tester
les 200 moteurs) alors que ...
[...]
Remplacez les '.' dans vos regexp par '.' et vous aurez le même temps
d'exécution que le script1.
[...]
Par contre je préfere le script1 pour des raisons pratiques , en travaillant
avec une liste de liste je peux travailler ET sur le moteur ET sur les
mots-clés alors qu'avec le script2 c soit l'un soit l'autre...
N'y a t-il pas moyen d'optimiser le script1 ?
Utilisez Q et E ou mieux 'index'.
(*) une autre raison qui pourrait vous faire préférer les expressions
régulières seraient l'usage du modificateur /i (insensible à la casse) pour
éviter les multiples recherches de "google", "googLE" et autres "GOOGLE". Mais
là encore, 'index' peut rester meilleur si vous prenez la peine de passer
votre chaîne dans la fonction lc() au préalable.
--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>
Le fait qu'il y ait des points dans vos noms à rechercher peuvent expliquer le temps d'exécution. Utilisez plutôt :
if ($elements[9] =~ /Q$liste_moteurs[$_][0]E/)
Le Q et le E encadre un bout de texte pour lequel vous ne voulez pas que les méta-caractères des regexp soient actifs.
Mais, quitte à effectuer une recherche pour chaque moteur, utilisez plutôt 'index' :
if (index($elements[9], $liste_moteurs[$_][0]) >= 0)
Dans votre cas, l'usage d'une expression régulière n'est intéressante que si vous faites tout d'un seul coup... et si elle est optimisée (*).
[...]
ce script la est tres lent avec quasi 100% d'utilisation CPU (10/12sec. ) sur un fichier de 18000 lignes ( c vrai que pour chaque ligne il faut tester les 200 moteurs) alors que ... [...]
Remplacez les '.' dans vos regexp par '.' et vous aurez le même temps d'exécution que le script1.
[...]
Par contre je préfere le script1 pour des raisons pratiques , en travaillant avec une liste de liste je peux travailler ET sur le moteur ET sur les mots-clés alors qu'avec le script2 c soit l'un soit l'autre...
N'y a t-il pas moyen d'optimiser le script1 ?
Utilisez Q et E ou mieux 'index'.
(*) une autre raison qui pourrait vous faire préférer les expressions régulières seraient l'usage du modificateur /i (insensible à la casse) pour éviter les multiples recherches de "google", "googLE" et autres "GOOGLE". Mais là encore, 'index' peut rester meilleur si vous prenez la peine de passer votre chaîne dans la fonction lc() au préalable.
-- Paul Gaborit - <http://www.enstimac.fr/~gaborit/> Perl en français - <http://www.enstimac.fr/Perl/>
Antoine Dinimant
Votre remarque n'est vrai que pour un ancrage donné (un moteur POSIX afficherait 'une' alors que perl affiche bien 'un').
Ceci étant, regardez l'exemple suivant :
'court et longueur' =~ m/(longueur|court)/; print $1;
C'est bien 'court' qui est trouvé en premier : la regex est reconnue au plus tôt (ceci est vrai que le moteur soit POSIX ou Perl). Le recherche de la regex la plus longue dans le cas d'une alternative (ce qui est fait en POSIX et non en Perl) n'a lieu qu'à un ancrage donné.
c'est juste. Le principe est bien "la reconnaissance la plus à gauche, puis la plus longue", mais j'oublie toujours le premier terme :-( Merci de la précision !
Si vous voulez en savoir plus sur les regex, il y a effectivement le livre que vous citez mais aussi toute la documentation qui vient avec Perl. Elle existe même en français :
RTFM, cela va sans dire... mais une doc, si bien construite soit-elle, n'a pas la même valeur pédagogique qu'un bouquin aussi bien fait que celui de Friedl (je précise que je n'ai pas d'actions chez O'Reilly ;-)). En l'espèce, perlre.html est assez lucide quant à sa pédagogie, précisant bien "Le niveau de ce document varie de ``difficile à comprendre'' jusqu'à ``totalement opaque''. La prose divaguante et criblée de jargon est difficile à interpréter en divers endroits."
La version anglaise ajoute à bon droit "This document needs a rewrite that separates the tutorial content from the reference content."
Votre remarque n'est vrai que pour un ancrage donné (un moteur POSIX
afficherait 'une' alors que perl affiche bien 'un').
Ceci étant, regardez l'exemple suivant :
'court et longueur' =~ m/(longueur|court)/;
print $1;
C'est bien 'court' qui est trouvé en premier : la regex est reconnue au plus
tôt (ceci est vrai que le moteur soit POSIX ou Perl). Le recherche de la
regex la plus longue dans le cas d'une alternative (ce qui est fait en POSIX
et non en Perl) n'a lieu qu'à un ancrage donné.
c'est juste. Le principe est bien "la reconnaissance la plus à gauche,
puis la plus longue", mais j'oublie toujours le premier terme :-(
Merci de la précision !
Si vous voulez en savoir plus sur les regex, il y a effectivement le livre
que vous citez mais aussi toute la documentation qui vient avec Perl. Elle
existe même en français :
RTFM, cela va sans dire... mais une doc, si bien construite soit-elle,
n'a pas la même valeur pédagogique qu'un bouquin aussi bien fait que
celui de Friedl (je précise que je n'ai pas d'actions chez O'Reilly
;-)). En l'espèce, perlre.html est assez lucide quant à sa pédagogie,
précisant bien "Le niveau de ce document varie de ``difficile à
comprendre'' jusqu'à ``totalement opaque''. La prose divaguante et
criblée de jargon est difficile à interpréter en divers endroits."
La version anglaise ajoute à bon droit "This document needs a rewrite
that separates the tutorial content from the reference content."
Votre remarque n'est vrai que pour un ancrage donné (un moteur POSIX afficherait 'une' alors que perl affiche bien 'un').
Ceci étant, regardez l'exemple suivant :
'court et longueur' =~ m/(longueur|court)/; print $1;
C'est bien 'court' qui est trouvé en premier : la regex est reconnue au plus tôt (ceci est vrai que le moteur soit POSIX ou Perl). Le recherche de la regex la plus longue dans le cas d'une alternative (ce qui est fait en POSIX et non en Perl) n'a lieu qu'à un ancrage donné.
c'est juste. Le principe est bien "la reconnaissance la plus à gauche, puis la plus longue", mais j'oublie toujours le premier terme :-( Merci de la précision !
Si vous voulez en savoir plus sur les regex, il y a effectivement le livre que vous citez mais aussi toute la documentation qui vient avec Perl. Elle existe même en français :
RTFM, cela va sans dire... mais une doc, si bien construite soit-elle, n'a pas la même valeur pédagogique qu'un bouquin aussi bien fait que celui de Friedl (je précise que je n'ai pas d'actions chez O'Reilly ;-)). En l'espèce, perlre.html est assez lucide quant à sa pédagogie, précisant bien "Le niveau de ce document varie de ``difficile à comprendre'' jusqu'à ``totalement opaque''. La prose divaguante et criblée de jargon est difficile à interpréter en divers endroits."
La version anglaise ajoute à bon droit "This document needs a rewrite that separates the tutorial content from the reference content."
Antoine Dinimant
En mémoire ? Plutôt en temps.
n'est-ce pas la même chose ? (je sens que je vais apprendre des choses :-)
En mémoire ? Plutôt en temps.
n'est-ce pas la même chose ?
(je sens que je vais apprendre des choses :-)
n'est-ce pas la même chose ? (je sens que je vais apprendre des choses :-)
Fabrice L.
Toujours pas compris pourquoi vous aviez besoin de regexp. Enfin, vous pourriez déjà les précompiler au lieu de les recompiler à chaque usage.
bon voila sans les regexp :
open F, "$dir_fichier"; @F = <F>; close F or die "unlock: $!n";
foreach (@F) {
$or{'Free'}++ if (grep (/free.fr/google.pl/,$_)); $or{'Google Images'}++ if (grep (/images.google/,$_)); $or{'Google France'}++ if (grep (/googLE.FR/,$_)); $or{'Google France'}++ if (grep (/GOOGLE.FR/,$_)); $or{'Google France'}++ if (grep (/64.233.161.104/,$_)); $or{'Google Belgique'}++ if (grep (/google.be/,$_)); $or{'Google Suisse'}++ if (grep (/google.ch/,$_)); $or{'Google France'}++ if (grep (/google.fr/,$_)); $or{'Google Allemagne'}++ if (grep (/google.de/,$_)); ### etc
}
etc...
cela dit, on doit pouvoir améliorer ce qui se trouve dans la boucle pour eviter de tout ecrire mais pour l'instant ca ira. de plus a l'utilisation, grep est tres rapide, moins d'1 seconde pour traiter les memes 18000 lignes du fichier. ce qui serait top c de génerer automatiquement ce qui se trouve dans la boucle en sachant qu'on connait les motifs ex: 'google.fr' et à quoi ca correspond ex: 'Google France'.
mais bon...
Fabrice
Toujours pas compris pourquoi vous aviez besoin de regexp. Enfin,
vous pourriez déjà les précompiler au lieu de les recompiler à chaque
usage.
bon voila sans les regexp :
open F, "$dir_fichier";
@F = <F>;
close F or die "unlock: $!n";
foreach (@F) {
$or{'Free'}++ if (grep (/free.fr/google.pl/,$_));
$or{'Google Images'}++ if (grep (/images.google/,$_));
$or{'Google France'}++ if (grep (/googLE.FR/,$_));
$or{'Google France'}++ if (grep (/GOOGLE.FR/,$_));
$or{'Google France'}++ if (grep (/64.233.161.104/,$_));
$or{'Google Belgique'}++ if (grep (/google.be/,$_));
$or{'Google Suisse'}++ if (grep (/google.ch/,$_));
$or{'Google France'}++ if (grep (/google.fr/,$_));
$or{'Google Allemagne'}++ if (grep (/google.de/,$_));
### etc
}
etc...
cela dit, on doit pouvoir améliorer ce qui se trouve dans la boucle pour
eviter de tout ecrire mais pour l'instant ca ira. de plus a l'utilisation,
grep est tres rapide, moins d'1 seconde pour traiter les memes 18000 lignes
du fichier.
ce qui serait top c de génerer automatiquement ce qui se trouve dans la
boucle en sachant qu'on connait les motifs ex: 'google.fr' et à quoi ca
correspond ex: 'Google France'.
Toujours pas compris pourquoi vous aviez besoin de regexp. Enfin, vous pourriez déjà les précompiler au lieu de les recompiler à chaque usage.
bon voila sans les regexp :
open F, "$dir_fichier"; @F = <F>; close F or die "unlock: $!n";
foreach (@F) {
$or{'Free'}++ if (grep (/free.fr/google.pl/,$_)); $or{'Google Images'}++ if (grep (/images.google/,$_)); $or{'Google France'}++ if (grep (/googLE.FR/,$_)); $or{'Google France'}++ if (grep (/GOOGLE.FR/,$_)); $or{'Google France'}++ if (grep (/64.233.161.104/,$_)); $or{'Google Belgique'}++ if (grep (/google.be/,$_)); $or{'Google Suisse'}++ if (grep (/google.ch/,$_)); $or{'Google France'}++ if (grep (/google.fr/,$_)); $or{'Google Allemagne'}++ if (grep (/google.de/,$_)); ### etc
}
etc...
cela dit, on doit pouvoir améliorer ce qui se trouve dans la boucle pour eviter de tout ecrire mais pour l'instant ca ira. de plus a l'utilisation, grep est tres rapide, moins d'1 seconde pour traiter les memes 18000 lignes du fichier. ce qui serait top c de génerer automatiquement ce qui se trouve dans la boucle en sachant qu'on connait les motifs ex: 'google.fr' et à quoi ca correspond ex: 'Google France'.
mais bon...
Fabrice
Laurent Wacrenier
Fabrice L. écrit:
Toujours pas compris pourquoi vous aviez besoin de regexp. Enfin, vous pourriez déjà les précompiler au lieu de les recompiler à chaque usage.
c a d ?
Toujours pas compris pourquoi vous aviez besoin de regexp.
Fabrice L. <rafale@altern.org> écrit:
Toujours pas compris pourquoi vous aviez besoin de regexp. Enfin,
vous pourriez déjà les précompiler au lieu de les recompiler à chaque
usage.
c a d ?
Toujours pas compris pourquoi vous aviez besoin de regexp.
Toujours pas compris pourquoi vous aviez besoin de regexp. Enfin, vous pourriez déjà les précompiler au lieu de les recompiler à chaque usage.
c a d ?
Toujours pas compris pourquoi vous aviez besoin de regexp.
Laurent Wacrenier
Fabrice L. écrit:
bon voila sans les regexp :
$or{'Free'}++ if (grep (/free.fr/google.pl/,$_));
Raté. Ici grep utilise des expressions rationnelles. C'est exactement la même chose que :
$or{'Free'}++ if /free.fr/google.pl/;
cela dit, on doit pouvoir améliorer ce qui se trouve dans la boucle pour eviter de tout ecrire mais pour l'instant ca ira. de plus a l'utilisation, grep est tres rapide, moins d'1 seconde pour traiter les memes 18000 lignes du fichier. ce qui serait top c de génerer automatiquement ce qui se trouve dans la boucle en sachant qu'on connait les motifs ex: 'google.fr' et à quoi ca correspond ex: 'Google France'.
C'est ce qu'il faut faire, générer la routine que va faire vérification.
Enfin, à condition que vous ayez un besoin des expressions rationnelle, besoin qui d'après vos exemples n'est nullement nessessaire.
Fabrice L. <rafale@altern.org> écrit:
bon voila sans les regexp :
$or{'Free'}++ if (grep (/free.fr/google.pl/,$_));
Raté. Ici grep utilise des expressions rationnelles.
C'est exactement la même chose que :
$or{'Free'}++ if /free.fr/google.pl/;
cela dit, on doit pouvoir améliorer ce qui se trouve dans la boucle pour
eviter de tout ecrire mais pour l'instant ca ira. de plus a l'utilisation,
grep est tres rapide, moins d'1 seconde pour traiter les memes 18000 lignes
du fichier.
ce qui serait top c de génerer automatiquement ce qui se trouve dans la
boucle en sachant qu'on connait les motifs ex: 'google.fr' et à quoi ca
correspond ex: 'Google France'.
C'est ce qu'il faut faire, générer la routine que va faire vérification.
Enfin, à condition que vous ayez un besoin des expressions rationnelle,
besoin qui d'après vos exemples n'est nullement nessessaire.
Raté. Ici grep utilise des expressions rationnelles. C'est exactement la même chose que :
$or{'Free'}++ if /free.fr/google.pl/;
cela dit, on doit pouvoir améliorer ce qui se trouve dans la boucle pour eviter de tout ecrire mais pour l'instant ca ira. de plus a l'utilisation, grep est tres rapide, moins d'1 seconde pour traiter les memes 18000 lignes du fichier. ce qui serait top c de génerer automatiquement ce qui se trouve dans la boucle en sachant qu'on connait les motifs ex: 'google.fr' et à quoi ca correspond ex: 'Google France'.
C'est ce qu'il faut faire, générer la routine que va faire vérification.
Enfin, à condition que vous ayez un besoin des expressions rationnelle, besoin qui d'après vos exemples n'est nullement nessessaire.
Antoine Dinimant
Fabrice L. a écrit:
bon voila sans les regexp : ...
$or{'Free'}++ if (grep (/free.fr/google.pl/,$_)); $or{'Google Images'}++ if (grep (/images.google/,$_)); $or{'Google France'}++ if (grep (/googLE.FR/,$_));
globalement parlant, un truc écrit entre / et / sans quotes, c'est une regex !
trouver la présence d'une chaîne dans une autre sans regex, c'est la fonction index... pour un exemple d'utilisation à adapter, voir mon premier post de cette nébuleuse discussion.
Fabrice L. a écrit:
bon voila sans les regexp :
...
$or{'Free'}++ if (grep (/free.fr/google.pl/,$_));
$or{'Google Images'}++ if (grep (/images.google/,$_));
$or{'Google France'}++ if (grep (/googLE.FR/,$_));
globalement parlant, un truc écrit entre / et / sans quotes, c'est une
regex !
trouver la présence d'une chaîne dans une autre sans regex, c'est la
fonction index... pour un exemple d'utilisation à adapter, voir mon
premier post de cette nébuleuse discussion.
$or{'Free'}++ if (grep (/free.fr/google.pl/,$_)); $or{'Google Images'}++ if (grep (/images.google/,$_)); $or{'Google France'}++ if (grep (/googLE.FR/,$_));
globalement parlant, un truc écrit entre / et / sans quotes, c'est une regex !
trouver la présence d'une chaîne dans une autre sans regex, c'est la fonction index... pour un exemple d'utilisation à adapter, voir mon premier post de cette nébuleuse discussion.
Julien Plée
RTFM, cela va sans dire... mais une doc, si bien construite soit-elle, n'a pas la même valeur pédagogique qu'un bouquin aussi bien fait que celui de Friedl (je précise que je n'ai pas d'actions chez O'Reilly ;-)). En l'espèce, perlre.html est assez lucide quant à sa pédagogie, précisant bien "Le niveau de ce document varie de ``difficile à comprendre'' jusqu'à ``totalement opaque''. La prose divaguante et criblée de jargon est difficile à interpréter en divers endroits."
Je confirme que ce livre est fantastique :) et je n'ai pas d'actions non plus, mais O'Reilly nous habitue à des ouvrages de très bonne qualité et on va pas s'en pleindre (à moins qu'on soit éditeur dans l'informatique) ;o)
Julien
RTFM, cela va sans dire... mais une doc, si bien construite soit-elle,
n'a pas la même valeur pédagogique qu'un bouquin aussi bien fait que
celui de Friedl (je précise que je n'ai pas d'actions chez O'Reilly
;-)). En l'espèce, perlre.html est assez lucide quant à sa pédagogie,
précisant bien "Le niveau de ce document varie de ``difficile à
comprendre'' jusqu'à ``totalement opaque''. La prose divaguante et
criblée de jargon est difficile à interpréter en divers endroits."
Je confirme que ce livre est fantastique :)
et je n'ai pas d'actions non plus, mais O'Reilly nous habitue à des ouvrages
de très bonne qualité et on va pas s'en pleindre (à moins qu'on soit éditeur
dans l'informatique) ;o)
RTFM, cela va sans dire... mais une doc, si bien construite soit-elle, n'a pas la même valeur pédagogique qu'un bouquin aussi bien fait que celui de Friedl (je précise que je n'ai pas d'actions chez O'Reilly ;-)). En l'espèce, perlre.html est assez lucide quant à sa pédagogie, précisant bien "Le niveau de ce document varie de ``difficile à comprendre'' jusqu'à ``totalement opaque''. La prose divaguante et criblée de jargon est difficile à interpréter en divers endroits."
Je confirme que ce livre est fantastique :) et je n'ai pas d'actions non plus, mais O'Reilly nous habitue à des ouvrages de très bonne qualité et on va pas s'en pleindre (à moins qu'on soit éditeur dans l'informatique) ;o)