2010-10-17 3 views
1

J'utilise URL.openStream() pour télécharger de nombreuses pages html pour un moteur de balayage que j'écris. La méthode fonctionne très bien localement sur mon mac mais sur mes écoles unix serveur la méthode est extrêmement lente. Mais seulement lors du téléchargement de la première page.URL.openStream() est très lent lorsqu'il est exécuté sur le serveur unix de l'école

Voici la méthode qui télécharge la page:

public static String download(URL url) throws IOException { 
    Long start = System.currentTimeMillis(); 
    InputStream is = url.openStream(); 
    System.out.println("\t\tCreated 'is' in "+((System.currentTimeMillis()-start)/(1000.0*60))+"minutes"); 
    ... 
} 

Et la principale méthode qui l'invoque:

LinkedList<URL> ll = new LinkedList<URL>(); 
ll.add(new URL("http://sheldonbrown.org/bicycle.html")); 
ll.add(new URL("http://www.trentobike.org/nongeo/index.html")); 
ll.add(new URL("http://www.trentobike.org/byauthor/index.html")); 
ll.add(new URL("http://www.myra-simon.com/bike/travel/index.html")); 
for (URL tmp : ll) { 
    System.out.println(); 
    System.out.println(tmp); 
    CrawlerTools.download(tmp); 
} 

Sortie locale (Note: tous sont rapides):

http://sheldonbrown.org/bicycle.html Créé 'est' à 0,00475 minutes

http://www.trentobike.org/nongeo/index.html Créé 'est' dans ,005083333333333333 minutes

http://www.trentobike.org/byauthor/index.html Créé 'est' dans ,0023833333333333332 minutes

http://www.myra-simon.com/bike/travel/index.html Créé 'est' à 0,00405 minutes

Sortie sur le serveur de la machine scolaire (Remarque: Tous sont rapides sauf le premier. Le premier est lent, peu importe ce que le premier site est):

http://sheldonbrown.org/bicycle.html Créé 'est' dans 3,2330666666666668 minutes

http://www.trentobike.org/nongeo/index.html Créé 'est' dans ,016416666666666666 minutes

http://www.trentobike.org/byauthor/index.html Créé 'est' en 0.0022166666666666667minutes

http://www.myra-simon.com/bike/travel/index.html Créé « est » dans ,009533333333333333 minutes

Je ne sais pas si cela est un problème Java (* Un problème dans mon code Java) ou d'un problème de serveur. Quelles sont mes options?


Lorsqu'il est exécuté sur le serveur c'est la sortie de la commande de temps:

real 3m11.385s 
user 0m0.277s 
sys  0m0.113s 

Je ne sais pas si cela est pertinent ... Que dois-je faire pour essayer d'isoler mon problème. ?

+0

De quel type d'URL s'agit-il? Cela arrive-t-il pour n'importe quelle URL ou seulement pour des URL spécifiques? Quel genre de connexion est-ce? –

+1

Avez-vous toujours la sortie complète, même si cela prend 3 minutes? Ou faut-il 3 minutes pour expirer et ne retourner aucune donnée? – VoteyDisciple

+0

Etes-vous autorisé à exécuter votre robot à l'école? De toute façon, votre meilleur pari est de contacter le networkadmin de l'école. – BalusC

Répondre

3

Vous avez répondu à votre propre question. Ce n'est pas un problème de Java, cela concerne le réseau ou le serveur de votre école.

Je vous recommande de signaler vos horaires en millisecondes et de voir s'ils sont répétable. Exécutez ce test dans une boucle - 1 000 ou 10 000 fois - et gardez une trace de toutes les valeurs que vous obtenez.Importez-les dans une feuille de calcul et calculez des statistiques. Regardez la distribution des valeurs. Vous ne savez pas si le point de données que vous avez est une valeur aberrante ou la valeur moyenne. Je vous recommande de faire cela pour les deux réseaux exactement de la même manière.

Je vous recommande également d'utiliser Fiddler ou un autre outil pour regarder le trafic réseau pendant le téléchargement. Vous pouvez avoir un meilleur aperçu de ce qui se passe et peut-être découvrir la cause première.

Mais ce n'est pas Java. C'est votre code, votre réseau. S'il s'agissait d'un bug dans le JDK, il aurait été corrigé il y a longtemps. Suspectez-vous d'abord, dernier et toujours.

MISE À JOUR:

Mon réseau admin m'a assuré que ce était une mauvaise implémentation Java Pas de problème de réseau . Qu'est-ce que tu penses?

"Assuré" vous? Quelle preuve a-t-il produite pour étayer cette conclusion? Quelles données? Quelles mesures ont été prises? On dirait de la paresse et de l'ignorance.

Il n'explique certainement pas pourquoi toutes les autres demandes se comportent très bien. Qu'est-ce qui a changé en Java entre le premier et les suivants? La JVM s'est-elle soudainement réécrite?

Vous pouvez l'accepter si vous le souhaitez, mais je dirais que votre administrateur réseau a honte de ne pas être plus curieux. Il aurait été plus honorable d'être honnête et de dire qu'ils ne savaient pas, n'avaient pas le temps et n'étaient pas intéressés.

+0

@duffymo, j'ai mis à jour ma question. Etrangement *** seulement *** prend beaucoup de temps pour la première URL. (J'ai essayé plusieurs fois comme le premier). – sixtyfootersdude

+0

Vous obtiendrez probablement une connexion ou une authentification ou autre chose qui se passe dans les coulisses. Peut-être vérifient-ils les informations d'identification, sortent vers un serveur LDAP et mettent en cache les résultats pour les connexions suivantes du même utilisateur et du même serveur. Demandez à votre administrateur réseau. – duffymo

+0

+1 - Demandez à vos administrateurs réseau. –

0

Par défaut Java préfère utiliser IPv6. Le pare-feu de mon école supprime tout le trafic IPv6 (sans avertissement). Après 3 minutes, 15 secondes, Java redevient IPv4. Cela me semble étrange que cela prenne autant de temps pour revenir à IPv4.

duffymo's answer, essentiellement: « Parlez à votre administrateur réseau », m'a aidé à résoudre le problème mais je pense que cela est un problème causé par une étrange mise en œuvre de Java et une configuration de réseau étrange.

Mon administrateur réseau m'a assuré que c'était une mauvaise implémentation de Java Pas un problème de réseau. Qu'est-ce que tu penses?