IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

2 questions sur l'API Regex


Sujet :

Collection et Stream Java

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Par défaut 2 questions sur l'API Regex
    Tout d'abord bonjour à tous !

    Je suis en train de réaliser un petit programme Java qui utilise la librairie regex fournie par Java. Cependant deux problèmes se posent.

    Tout d'abord je trouve l'API regex assez lente . En effet, j'utilise principalement la méthode replaceAll de la classe string (qui fait appel à l'API regex) et certains traitement prenne pas mal de temps (plusieurs milliers d'itérations/d'appels à replaceAll). Y-a-t-il une solution pour optimiser la vitesse d'execution de cette méthode ?

    D'autre part un deuxième problème se pose. Lors de l'utilisation de certains motifs d'expressions regulières, j'obtiens une exception de type stackoverflowerror. Ce type d'erreur à fait l'objet de la publication d'un billet sur le site de sun : http://bugs.sun.com/bugdatabase/view...bug_id=5050507
    La seule solution consiste-telle a réécrire l'expression régulière engendrant cette exception en utilisant un autre motif ?

    Merci à tous. Bonne journée.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par themad Voir le message
    Tout d'abord je trouve l'API regex assez lente . En effet, j'utilise principalement la méthode replaceAll de la classe string (qui fait appel à l'API regex) et certains traitement prenne pas mal de temps (plusieurs milliers d'itérations/d'appels à replaceAll). Y-a-t-il une solution pour optimiser la vitesse d'execution de cette méthode ?
    Si le pattern est toujours le même, il y a une optimisation à faire qui consiste à le créer une fois pour toutes, par exemple si tu as quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (...) {
        String result = line.replaceAll("regex", "remplacement");
    }
    Tu pourrais faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Pattern pattern = Pattern.compile("regex");
    for (...) {
        String result =pattern.matcher(line).replaceAll("remplacement");
    }
    Cela évitera de recompiler plusieurs fois le pattern, ce qui est assez coûteux...

    Citation Envoyé par themad Voir le message
    D'autre part un deuxième problème se pose. Lors de l'utilisation de certains motifs d'expressions regulières, j'obtiens une exception de type stackoverflowerror. Ce type d'erreur à fait l'objet de la publication d'un billet sur le site de sun : http://bugs.sun.com/bugdatabase/view...bug_id=5050507
    La seule solution consiste-telle a réécrire l'expression régulière engendrant cette exception en utilisant un autre motif ?
    C'est inhérent aux expressions régulières elles-mêmes (et non pas à leur implémentation Java).
    Il y a des expressions qui dans certaines conditions peuvent provoquer un grand nombre de récursion, ce qui provoque une grosse consommation CPU et même des stackoverflow...


    Il faudrait que tu postes tes regexp et leurs objetifs...

    a++

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Par défaut
    re merci de tes réponses !

    Si le pattern est toujours le même, il y a une optimisation à faire qui consiste à le créer une fois pour toutes, par exemple si tu as quelque chose comme ceci :
    Entendu, je vais essayer cette piste et voir la différence .

    Il faudrait que tu postes tes regexp et leurs objetifs...
    Pour les regex ca ressemble à des trucs de ce genre permettant de matcher des commentaires :
    - /\*[\u0000-\uffff]*?\*/ -> commentaire java /*...*/
    - //.* -> commentaire java //...
    - ...

    Merci de ton aide .Voilà.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    pour l'erreur. Je me souviens avoir eu ce genre de problème avec un java 1.4, çà a été résolu avec une version de java supérieure dont l'implémentation était visiblement différente. Sans jamais savoir pourquoi çà foirait! Tout ce que j'en ai conclu à l'époque c'est que la regexp était peu en cause, c'était surtout la longueur de la string sur laquelle on faisait le match qui impliquait une énorme récursivité.

    par contre le [\u0000-\uffff] çà fait un très grand range et çà inclue la séquence */, tu risque de ne pas choper la fin de commentaire puisque les regexp sont d'algorithme gourmand par défaut.

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    par contre le [\u0000-\uffff] çà fait un très grand range et çà inclue la séquence */, tu risque de ne pas choper la fin de commentaire puisque les regexp sont d'algorithme gourmand par défaut.
    Pour cela c'est bon il utilise un quantifier "reluctant" (le *?).
    Par contre quel intérêt d'utiliser [\u0000-\uffff] là où le point ferait l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String pattern = "/\\*.*?\\*/";
    a++

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Pour cela c'est bon il utilise un quantifier "reluctant" (le *?).
    Honte à moi de ne pas l'avoir vu!

  7. #7
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Par défaut
    bonsoir à tous !

    Premier point en ce qui concerne la compilation des pattern. Effectivement, le fait de ne pas recompiler le pattern à chaque fois améliore la vitesse d'exécution du programme . Je ne saurais vous dire le pourcentage/ratio d'augmentation mais c'est visible sans faire de calcul donc ça doit quand même être non négligeable.
    Seul bémol certains traitement reste encore long (et pourtant j'utilise des threads séparés...).

    pour l'erreur. Je me souviens avoir eu ce genre de problème avec un java 1.4, çà a été résolu avec une version de java supérieure dont l'implémentation était visiblement différente. Sans jamais savoir pourquoi çà foirait! Tout ce que j'en ai conclu à l'époque c'est que la regexp était peu en cause, c'était surtout la longueur de la string sur laquelle on faisait le match qui impliquait une énorme récursivité.
    J'utilise la 1.5 en ce qui me concerne et j'ai quand même des erreurs mais comme il l'a été dit plus haut je pense que ca vient de la regex en elle même car ca ne m'arrive que sur certains type de regex du type (x|y)*
    Mais il est vrai que les regex sur lequelles j'ai travaillé au départ avait une taille assez conséquente (de l'ordre de 20 caracteres) donc peut etre la taille a-t-elle aussi une influence.

    par contre le [\u0000-\uffff] çà fait un très grand range et çà inclue la séquence */, tu risque de ne pas choper la fin de commentaire puisque les regexp sont d'algorithme gourmand par défaut.
    J'ai du mal a voir ce que tu veux dire par "tu risque de ne pas choper la fin de commentaire" et le rapport avec le range ? Pourrais-tu préciser s'il te plait ?

    Pour cela c'est bon il utilise un quantifier "reluctant" (le *?).
    Par contre quel intérêt d'utiliser [\u0000-\uffff] là où le point ferait l'affaire :
    C'est noté, je changerai. En fait j'ai tenté de simplifié au maximum l'écriture de la regex en pensant que ca irait plus vite mais effectivement peut etre que le fait de mettre un "interval" large empire plus les choses que ca ne les améliore. Je vais tester la vitesse d'execution avec ta proposition de regex .

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    je crois que la taille de la regexp a moins d'importance que la "vitesse" à laquelle elle parcours ta string pour faire le match, puisque à chaque fois qu'elle s'arrete pour un morceau trouvé et vérifie si le morceau suivant cadre avec, elle récurse (il me semble). Donc les opérateur reluctant ont tendance à augmenter la complexité. En même temps, je connais pas les détails de l'algorithme.

Discussions similaires

  1. Question sur l'API "minimum"
    Par shama dans le forum IGN API Géoportail
    Réponses: 10
    Dernier message: 24/06/2010, 00h19
  2. Questions sur les apis
    Par ApheX2 dans le forum Moteurs 3D
    Réponses: 9
    Dernier message: 22/06/2009, 09h20
  3. [OpenGL] Petite question sur l'API
    Par Fabien Henon dans le forum OpenGL
    Réponses: 7
    Dernier message: 16/01/2008, 23h27
  4. [C++] 2 petites questions sur l'API Windows
    Par Fabien Henon dans le forum Windows
    Réponses: 15
    Dernier message: 25/12/2007, 11h54
  5. 2 questions sur l'API java
    Par ®om dans le forum Langage
    Réponses: 8
    Dernier message: 28/07/2006, 09h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo