2014-09-26 87 views
1

在工作中,我運氣不好,已經修復了由別人完成的python中寫得不好的url驗證器腳本。這是一個非常混亂的代碼,並試圖修復其中一個錯誤,我發現了一些我不明白的行爲。python 2.7 IOError:[Errno 24]太多打開的文件:

腳本必須處理一個文件,其中包含大約10萬個url,它必須檢查每個url以查看它是否有效,不僅在它的結構中,還檢查它是否存在(使用pycurl)。在代碼的一部分,這樣做是:

for li in lineas: 
    liNew = "http://" + li 
    parsedUrl = urlparse.urlparse(liNew)  

在這種情況下,錯誤是增加的「http://」在該行的開始,因爲當時正在對劇本之前完成。所以我改變了代碼如下:

for li in lineas: 
    liNew = li 
    parsedUrl = urlparse.urlparse(liNew)  

現在,相同的輸入文件中的腳本失敗,錯誤:

IOError: [Errno 24] Too many open files:/path/to/file/being/written/to.txt 

隨着LINEW = 「HTTP://」 +李,文件描述符不超過1024的默認限制,但將該行更改爲liNew = li將使它們超過8000,爲什麼?

回答

0

With liNew = "http://" + li, file descriptors don't go over the default limit of 1024, but changing that line to liNew = li will make them go over 8000, why ??

  • 前:URL損壞 - 沒有獲取下載(沒有文件打開)
  • 後:正確的URL - 網址保存到文件(有10K的URL)

它可能沒有意義同時下載幾百個URL(帶寬,磁盤)。確保所有文件(套接字,磁盤文件)在下載後妥善處理(及時調用close()方法)。

默認限制(1024)很低,但不會增加它,除非您明白代碼的作用。

+0

是的,這是有道理的。我正在重寫整個事情,這是一個混亂,我更容易從頭開始。 – Juancho 2014-09-27 23:55:54

相關問題