在学校的unix服务器上运行时,URL.openStream()非常慢

时间:2010-10-17 13:49:29

标签: java url

我正在使用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                   在0.00475分钟内创建'是'

     

http://www.trentobike.org/nongeo/index.html                   在0.005083333333333333分钟创建'是'

     

http://www.trentobike.org/byauthor/index.html                   在0.0023833333333333332分钟创建'是'

     

http://www.myra-simon.com/bike/travel/index.html                   在0.00405分钟内创建'是'

校园机器服务器上的输出(注意:除了第一个以外,所有都很快。第一个是慢的,无论第一个站点是什么)

  

http://sheldonbrown.org/bicycle.html                   在3.2330666666666668分钟内创建了“是”

     

http://www.trentobike.org/nongeo/index.html                   在0.016416666666666666分钟内创建'是'

     

http://www.trentobike.org/byauthor/index.html                   在0.0022166666666666667分钟创建'是'

     

http://www.myra-simon.com/bike/travel/index.html                   在0.009533333333333333分钟创建'是'

我不确定这是Java问题(*我的Java代码中的问题)还是服务器问题。我有什么选择?


在服务器上运行时,这是time命令的输出:

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

我不确定这是否相关......我应该怎样做以试图找出我的问题..?

2 个答案:

答案 0 :(得分:3)

你已经回答了自己的问题。这不是Java问题,而是与学校的网络或服务器有关。

我建议您以毫秒为单位报告时间,看看它们是否可重复。在循环中运行该测试 - 1,000或10,000次 - 并跟踪您获得的所有值。将它们导入电子表格并计算一些统计信息。看看价值的分布。您不知道您拥有的一个数据点是异常值还是平均值。我建议您以完全相同的方式为两个网络执行此操作。

我还建议您在下载时使用Fiddler或其他工具来观看网络流量。您可以更好地了解正在发生的事情,并可能找出根本原因。

但它不是Java。这是你的代码,你的网络。如果这是JDK中的一个错误,它很久以前就已经修复了。首先,最后和永远怀疑自己。

更新:

  

我的网络管理员向我保证这一点   是一个糟糕的Java实现不是一个   网络问题。你觉得怎么样?

“保证”你?他/她为证实这一结论所做的证据是什么?什么数据?进行了哪些测量?对我来说听起来像懒惰和无知。

它肯定无法解释为什么所有其他请求都表现得很好。在第一次和后续调用之间Java的变化是什么? JVM突然重写了吗?

如果你愿意,你可以接受它,但我会说你的网络管理员感到羞耻,因为你不会更好奇。如果说实话并说他们不知道,没有时间,并且没有兴趣,那将更加光荣。

答案 1 :(得分:0)

默认情况下,Java更喜欢使用IPv6。我学校的防火墙 丢弃所有IPv6流量(没有警告)。 3分钟后,Java回退到IPv4。对我来说似乎很奇怪,它需要很长时间才能回归到IPv4。

duffymo's answer,本质上:“与你的网络管理员谈谈”,帮助我解决了问题但是我认为这是一个奇怪的Java实现和一个奇怪的问题网络配置。

我的网络管理员向我保证这是一个糟糕的java实现不是网络问题。你觉得怎么样?