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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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!

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