2012-03-30 72 views
0

我有一個python程序,它處理一個html頁面,並創建一個url的字典作爲key和文件的md5sum作爲一個值。字典長度是6000.每個url都是一個zip文件,它被下載到機器中,每次下載文件後檢查md5sum。所有要下載的文件的總大小爲572 GB。我該怎麼做才能讓我的程序運行得更快?

網址是具有下載的鏈接,如價值文件的密鑰和的md5sum字典

的代碼是

 DownloadAllURLs(URLs) 

     def DownloadAllURLs(URLs): 
      for eachurl in URLs: 
       if os.path.isfile(eachurl): 
        print eachurl, "already exists" 
       else: 
        print "Going to Download",eachurl 
        Download(eachurl) 
        CheckMd5(eachurl,URLs(eachurl)) 

     def Download(eachurl): 
      command='sudo wget --user=abc --password=xyz' 
      command=command+" "+url 
      print command 
      result=subprocess.Popen(command,shell=True,stdout=subprocess.PIPE, 
      stderr=subprocess.PIPE) 
      out, err=result.communicate() 

     def CheckMd5(url,tail,md5sum): 
      command=['md5sum',tail] 
      result=subprocess.Popen(command,stdout=subprocess.PIPE,stdin=subprocess.PIPE) 
      md5, err=result.communicate() 
      if(md5[:32]==md5sum): 
       print "The",tail,"is downloaded successufully with correct md5" 
      else: 
       print "The",tail,"is not downloaded correcty wrong md5" 
       WriteWarcFile(url,tail) 
       CheckMd5(url,tail,md5sum) 

上面的代碼下載一切對我來說6000個zip文件,但從我在哪裏下載服務器很慢,我只能得到40-60 kbps的下載時有時..

我用上面的代碼來下載像數據的1-3 T字節....我想平行我的鱈魚e在Python中(所以處理的時間會減少),但我不確定是使用多線程還是多處理或其他。

我讀的教程,但不知道如何着手。謝謝

編輯:

感謝所有的答覆,主要的問題我要問的是如何在這樣的情況下應用多線程/多線程。假設我做的每一個URL的一些操作,而不是下載它,如下面的代碼,我可以讓它更快了使用多線程或mutlprocessing

from urlparse import urlparse 
    ProcessAllURLs(URLs) 
    def ProcessAllURLs(URLs): 
     for eachurl in URLs: 
       x=urlparse(eachurl) 
       print eachurl.netloc 
+6

下載千兆字節是使服務器癱瘓。讓我們嘗試用請求的5倍速度擊中它! – 2012-03-30 21:27:00

+0

@kich是你的程序太慢還是服務器太慢? – 2012-03-30 21:31:01

+0

我認爲服務器速度很慢,有時它會給我提供40kbps的速度,否則它會提供26 mbps的速度。我沒有選擇,而不是從他們的服務器上下載,所以我想知道是否有任何方法可以ping服務器多次並下載更快 – kich 2012-03-30 21:35:06

回答

0

由於處理IO的限制,應該可以使用Python多線程 - 全局解釋鎖不會影響數據的性能產生很大

相關問題