代码之家  ›  专栏  ›  技术社区  ›  sixtyfootersdude

在学校的Unix服务器上运行时,url.openstream()非常慢。

  •  1
  • sixtyfootersdude  · 技术社区  · 14 年前

    我正在使用 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分钟后创建“is”

    http://www.trentobike.org/nongeo/index.html 在0.0050833333333333333分钟内创建“is”

    http://www.trentobike.org/byauthor/index.html 在0.00238333333333333333332分钟内创建了“is”

    http://www.myra-simon.com/bike/travel/index.html 0.00405分钟后创建“is”

    学校机器服务器上的输出 (注:除第一个外,其他都很快。不管第一个站点是什么,第一个站点都很慢) :

    网址:http://sheldonbrown.org/bicycle.html 在3.2330666666666668分钟内创建“is”

    http://www.trentobike.org/nongeo/index.html 在0.016416666666666666分钟内创建了“is”

    http://www.trentobike.org/byauthor/index.html 在0.0022166666666666667分钟内创建“is”

    http://www.myra-西蒙.com/bike/travel/index.html 在0.0095333333333333333分钟内创建“is”

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


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

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

    我不确定这是否相关…我该怎么做来隔离我的问题….

    2 回复  |  直到 13 年前
        1
  •  3
  •   duffymo    14 年前

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

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

    我还建议您在下载时使用fiddler或其他工具来监视网络流量。你可以更好地了解正在发生的事情,也许可以找出根本原因。

    但它不是Java。这是你的代码,你的网络。如果这是JDK中的一个bug,它早就被修复了。先怀疑自己,后怀疑自己,永远怀疑自己。

    更新:

    我的网络管理员向我保证 是一个糟糕的Java实现而不是 网络问题。你怎么认为?

    “放心”你?他/她提供了什么证据来支持这个结论?什么数据?进行了哪些测量?听起来像是懒惰和无知。

    它当然不能解释为什么所有其他请求都表现得很好。Java在第一次调用和后续调用之间发生了什么变化?JVM是否突然重写了自己?

    如果你愿意的话,你可以接受它,但我会说你的网络管理员不太好奇心。老实说,他们不知道,没有时间,也不感兴趣,这会更为光荣。

        2
  •  0
  •   Community paulsm4    7 年前

    默认情况下,Java更倾向于使用IPv6。我学校的防火墙 删除所有IPv6流量(无警告)。3分钟后,Java 15秒返回IPv4。在我看来,回到IPv4需要这么长时间,这似乎很奇怪。

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

    我的网络管理员向我保证,这是一个糟糕的Java实现,而不是网络问题。你怎么认为?