J'ai construit un petit robot et maintenant, en l'essayant, j'ai constaté que lors de l'exploration de certains sites, mon robot utilisait 98 à 99% de la CPU.
J'ai utilisé dotTrace
pour voir quel était le problème et il m'a orienté vers ma méthode httpwebrequest
- je l'ai optimisé un peu à l'aide de questions précédentes sur stackoverflow .. mais le problème était toujours là.
Je suis ensuite allé voir les URL qui étaient à l'origine de la charge du processeur et constaté qu'il s'agissait en fait de sites extrêmement volumineux - allez donc comprendre :) Alors, je suis maintenant à 99% certain que cela concerne le code suivant:
HtmlAgilityPack.HtmlDocument documentt = new HtmlAgilityPack.HtmlDocument();
HtmlAgilityPack.HtmlNodeCollection list;
HtmlAgilityPack.HtmlNodeCollection frameList;
documentt.LoadHtml(_html);
list = documentt.DocumentNode.SelectNodes(".//a[@href]");
Tout ce que je veux faire est d'extraire les liens sur la page, donc pour les grands sites .. y at-il de toute façon je peux obtenir cela pour ne pas utiliser autant de CPU?
Je pensais peut-être limiter ce que je vais chercher? Quelle serait ma meilleure option ici?
Certainement quelqu'un doit avoir rencontré ce problème avant :)
".//a[@href]" est XPath extrêmement lent. J'ai essayé de remplacer par "// a [@href]" ou par un code qui parcourt tout le document et vérifie tous les nœuds A.
Pourquoi cette XPath est lente:
La partie 1 + 2 se termine par "pour chaque nœud, sélectionnez tous ses nœuds descendants", ce qui est très lent.
Si vous n'êtes pas très investi dans le pack d'agilité HTML, essayez plutôt d'utiliser CsQuery . Il crée un index lors de l'analyse des documents et les sélecteurs sont beaucoup plus rapides que HTML Agility Pack. Voir une comparaison.
CsQuery est un port .NET jQuery avec un moteur de sélecteur CSS complet; il vous permet d'utiliser des sélecteurs CSS ainsi que l'API jQuery pour accéder au HTML et le manipuler. C'est sur le nuget comme CsQuery.