URL.openStream () работает очень медленно при запуске на школьном Unix-сервере - PullRequest
1 голос
/ 17 октября 2010

Я использую URL.openStream() для загрузки многих html-страниц для поискового робота, который я пишу.Метод отлично работает локально на моем Mac, однако на моем школьном Unix-сервере этот метод очень медленный. Но только при загрузке первой страницы.

Вот метод загрузки страницы:

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");
    ...
}

И основной метод, который вызывает ее:

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);
}

Вывод локально (Примечание: все быстро) :

http://sheldonbrown.org/bicycle.html Создано 'is' за 0,00475 минут

http://www.trentobike.org/nongeo/index.html Создано 'is' за 0.005083333333333333 минуты

http://www.trentobike.org/byauthor/index.html Создано 'is' за 0.0023833333333333332 минут

http://www.myra -simon.com / bike /travel / index.html Создано 'is' за 0,00405 минут

Вывод на сервер School Machine Server (Примечание. Все быстрые, кроме первого. Первый медленный независимо отчто такое первый сайт) :

http://sheldonbrown.org/bicycle.html Создано 'is' в 3.2330666666666668 минутах

http://www.trentobike.org/nongeo/index.html Создано 'is' в 0.016416666666666666минут

http://www.trentobike.org/byauthor/index.html Создано 'is' за 0.0022166666666666667 минут

http://www.myra -simon.com / bike / travel / index.html Создано 'isв 0.009533333333333333minutes

Я не уверен, является ли это проблемой Java (* проблема в моем коде Java) или проблемой сервера.Какие у меня варианты?


При запуске на сервере это вывод команды времени:

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

Я не уверен, что это уместно ... Что я должен сделать, чтобы попытатьсяизолировать мою проблему ..?

Ответы [ 2 ]

3 голосов
/ 17 октября 2010

Вы ответили на свой вопрос.Это не проблема Java, это связано с сетью или сервером вашей школы.

Я бы порекомендовал вам сообщать о времени в миллисекундах и проверять, могут ли они повторяться .Выполните этот тест в цикле - 1000 или 10000 раз - и отслеживайте все полученные значения.Импортируйте их в электронную таблицу и рассчитайте статистику.Посмотрите на распределение ценностей.Вы не знаете, является ли одна имеющаяся у вас точка данных выбросом или средним значением.Я бы порекомендовал сделать это для обеих сетей одинаково.

Я бы также порекомендовал использовать Fiddler или какой-либо другой инструмент для отслеживания сетевого трафика при загрузке.Вы можете лучше понять, что происходит, и, возможно, выяснить причину.

Но это не Java.Это твой код, твоя сеть.Если бы это была ошибка в JDK, это было бы исправлено давно.Подозревай себя первым, последним и всегда.

ОБНОВЛЕНИЕ:

Мой сетевой администратор заверил меня, что это плохая реализация Java, а не проблема сети.Что ты думаешь?

"Заверил" тебя?Какие доказательства он / она представил в поддержку этого вывода?Какие данные?Какие измерения были сделаны?Звучит как лень и невежество для меня.

Это, конечно, не объясняет, почему все остальные запросы работают нормально.Что изменилось в Java между первым и последующим вызовами?JVM внезапно переписала себя?

Вы можете принять это, если хотите, но я бы сказал, что позор вашего сетевого администратора, что он не был более любопытным.Было бы более честно быть честным и говорить, что они не знали, не имели времени и не интересовались.

0 голосов
/ 20 октября 2010

По умолчанию Java предпочитает использовать IPv6. Брандмауэр моей школы отбрасывает весь трафик IPv6 (без предупреждения). Через 3 минуты 15 секунд Java возвращается к IPv4. Мне кажется странным, что для возврата к IPv4 требуется так много времени.

ответ Даффимо , по сути: «Поговори с администратором сети» , помог мне решить проблему, однако я думаю, что это проблема, вызванная странной реализацией Java и странная конфигурация сети.

Мой сетевой администратор заверил меня, что это плохая реализация Java, а не проблема сети. Что ты думаешь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...