2010-10-17 83 views
1

我正在使用URL.openStream()爲我正在編寫的爬蟲下載許多html頁面。該方法在我的Mac上本地運行良好,但是在我的學校unix服務器上,該方法非常緩慢。 但只有下載第一頁時。在學校的unix服務器上運行時,URL.openStream()速度很慢

這裏是下載頁面的方法:

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代碼的問題)或服務器問題。我有什麼選擇?


當在服務器上運行,這是一次命令的輸出:

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

我不知道這是否是相關的......我應該怎麼做,試圖孤立我的問題。 。?

+0

它是什麼類型的URL?這是發生在任何網址或只是特定的?它是什麼樣的連接? – 2010-10-17 13:51:00

+1

即使需要3分鐘,你是否仍然會獲得完整的輸出?或者僅僅需要3分鐘才能超時並返回任何數據? – VoteyDisciple 2010-10-17 13:53:55

+0

您可以在學校運行爬蟲嗎?無論如何,你最好的選擇是聯繫學校的網絡管理員。 – BalusC 2010-10-17 13:57:42

回答

3

您已回答了您自己的問題。這不是Java問題,它與你學校的網絡或服務器有關。

我建議你報告你的時間以毫秒爲單位,看他們是否可重複。在循環中運行該測試 - 1,000或10,000次 - 並記錄所有您獲得的值。將它們導入電子表格並計算一些統計數據。看看價值的分佈。您不知道您擁有的某個數據點是異常值還是平均值。我建議你以完全相同的方式爲兩個網絡完成此操作。

我還建議您使用Fiddler或其他工具來觀看下載的網絡流量。您可以更好地瞭解正在發生的事情,並可能找出根本原因。

但它不是Java。這是你的代碼,你的網絡。如果這是JDK中的一個錯誤,它將在很久以前被修復。首先,最後,永遠懷疑自己。

UPDATE:

我的網絡管理員向我保證,這 是一個糟糕的java實現不是 網絡問題。你怎麼看?

「確定」你?他/她出示了哪些證據來支持這一結論?什麼數據?採取了什麼措施?聽起來像懶惰和無知。

它當然不能解釋爲什麼所有其他的請求表現得很好。 Java在第一次和後續調用之間發生了什麼變化? JVM是否突然重寫了自己?

如果你願意,你可以接受它,但我會說你的網絡管理員對你的好奇心不好。說實話,說他們不知道,沒有時間,並且不感興趣,這會更光榮。

+0

@duffymo,我更新了我的問題。奇怪的是,***只需要很長時間才能看到第一個網址。 (我已經嘗試了多個作爲第一個)。 – sixtyfootersdude 2010-10-17 14:18:09

+0

可能會獲得連接或身份驗證或幕後發生的其他事情。也許他們檢查證書,出去到LDAP服務器,並緩存來自同一用戶和服務器的後續連接的結果。詢問你的網絡管理員。 – duffymo 2010-10-17 14:22:09

+0

+1 - 詢問你的網絡管理員。 – 2010-10-17 14:27:57

0

默認情況下Java更喜歡使用IPv6。我學校的防火牆 將丟棄所有IPv6流量(不發出警告)。 3分鐘後,Java返回到IPv4 15秒。看起來很奇怪,回到IPv4需要很長時間。

duffymo's answer,主要有:「去跟你的網絡管理員」,幫我解決這個問題,但是我認爲,這是由一個奇怪的Java實現和一個陌生的網絡配置有問題。

我的網絡管理員向我保證,這是一個糟糕的Java實現不是網絡問題。你怎麼看?

相關問題