Java regex performance
Je suis en train d'analyser les liens avec la regex avec Java.
Mais je pense qu'il devient trop lent. Par exemple, pour extraire tous les liens à partir de:
...c'est des dépenses 34642 millisecondes (34 secondes!!!)
Voici la regex:
private final String regexp = "<a.*?\\shref\\s*=\\s*([\\\"\\']*)(.*?)([\\\"\\'\\s].*?>|>)";
Les drapeaux pour le modèle:
private static final int flags = Pattern.CASE_INSENSITIVE | Pattern.DOTALL |Pattern.MULTILINE | Pattern.UNICODE_CASE | Pattern.CANON_EQ;
Et le code peut être quelque chose comme ceci:
private void processURL(URL url){
URLConnection connection;
Pattern pattern = Pattern.compile(regexp, flags);
try {
connection = url.openConnection();
InputStream in = connection.getInputStream();
BufferedReader bf = new BufferedReader(new InputStreamReader(in));
String html = new String();
String line = bf.readLine();
while(line!=null){
html += line;
line = bf.readLine();
}
bf.close();
Matcher matcher = pattern.matcher(html);
while (matcher.find()) {
System.out.println(matcher.group(2));
}
} catch (Exception e){
}
}
Pouvez-vous me donner un Indice?
Données Supplémentaires:
1Mbit
Core 2 Duo
1 go de RAM
Mono-Thread
regex en grattant un site web! Mauvaise mauvaise mauvaise option!
il tourne plus vite si votre téléchargement de l'ensemble de la page en premier, puis exécutez votre regex? Êtes-vous sûr que c'est la regex prend autant de temps et de ne pas les différentiels de téléchargement?
Oui Steven, c'est l'expression rationnelle des choses. Je suis en train de faire certains profils avec Différent des Analyseurs.
Cette réponse aussi, des réponses à cette question.
il tourne plus vite si votre téléchargement de l'ensemble de la page en premier, puis exécutez votre regex? Êtes-vous sûr que c'est la regex prend autant de temps et de ne pas les différentiels de téléchargement?
Oui Steven, c'est l'expression rationnelle des choses. Je suis en train de faire certains profils avec Différent des Analyseurs.
Cette réponse aussi, des réponses à cette question.
OriginalL'auteur santiagobasulto | 2010-10-11
Vous devez vous connecter pour publier un commentaire.
Conseil: N'utilisez pas les regexes pour l'extraction de lien ou d'autres HTML "analyse" tâches!
Votre regex dispose de 6 (SIX) répéter les groupes. De l'exécution, il entraînera beaucoup de recul. Dans le pire des cas, elle pourrait même approche
O(N^6)
où N est le nombre de caractères d'entrée. Vous pourriez alléger un peu en remplaçant désireux de correspondance avec lazy correspondance, mais il est presque impossible d'éviter les cas pathologiques; par exemple, lorsque les données d'entrée est suffisamment mal formés que la regex ne correspond pas.De loin, la meilleure solution est d'utiliser certains stricte ou permissive analyseur HTML. Même l'écriture d'un ad-hoc de l'analyseur à la main va être mieux que d'utiliser gnarly regexes.
Cette page qui répertorie les différents parseurs HTML pour Java. J'ai entendu de bonnes choses au sujet de TagSoup et HtmlCleaner.
Merci frère, je vais essayer avec javax.swing.texte.html.HTMLEditorKit
OriginalL'auteur Stephen C
J'ai écrit un test simple pour comparer 10 millions opération RegExp performance contre
String.indexof()
avec le suivant résultat:indexOf()
est plus rapide que la regex pour cette tâche particulière, mais pourquoi voudriez-vous utiliser une regex pour qui? Comment les OP utilisationindexOf()
pour résoudre son problème?OriginalL'auteur Jonny
Essayer Escapade à la place. Merci de ne pas utiliser les regex pour cela.
La Regex de l'utilisation et de la Regex abus
Source
Regex est une opération très coûteuse. Et pendant que vous êtes en raclant un site web, vous aurez besoin d'analyser beaucoup de texte. glands.com.au/blog/?p=136
La complexité de l'évaluation de l'expression régulière est quelque chose de terrible selon le linéaire de la complexité de l'analyse de la page HTML
OriginalL'auteur zengr
Tout votre temps, tous, est passé ici:
Utiliser un StringBuffer. Mieux encore, si vous le pouvez, exécutez le match sur chaque ligne et de ne pas les accumuler.
Je l'ai essayé, ça ne change rien.
Vous avez essayé quoi exactement?
Désolé EJP. Ça ne change rien sur les grands temps qu'il faut pour l'analyser avec la regex. Il n'changer quelque chose, mais n'en est rien, en la comparant avec le temps global. C'est une bonne astuce bien, j'ai codé comme ça.
OriginalL'auteur user207421