2012-03-30 4 views
0

私はhtmlページを処理するpythonプログラムを持っていて、urlの辞書をキーとして、ファイルのmd5sumを値として作成します。辞書の長さは6000です。各URLは、ファイルがダウンロードされた後にmd5sumを調べるたびに、マシンにダウンロードされるzipファイルです。ダウンロードするすべてのファイルの合計サイズは572 GBです。私のプログラムをより速く動かすにはどうすればよいですか?

のURLが値

としてキーとファイルの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〜60kbpsしか得られません。

私は上記のコードを使って1-3テラバイトのデータをダウンロードしています。私のタラをパラレル化するeを処理する時間が短縮されますが、マルチスレッドやマルチプロセッシングなどを使用するかどうかはわかりません。

私はチュートリアルを読んでいますが、進める方法がわかりません。あなた

編集ありがとう:すべての返信用

おかげで、私がお聞きしたい主な問題は、このような場合には、マルチスレッド/マルチスレッドを適用する方法です。私は、すべてのURLにいくつかの操作を行うのではなく、以下のコードのようにそれをダウンロードしていたと、私はそれがすべてのより高速なマルチスレッドを使用するか、または処理がIOバウンドであるとして、Pythonのマルチスレッドを使用することが可能でなければなりません

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

テラバイトのデータをダウンロードすると、サーバーが壊れてしまいます。 5倍の速さでリクエストに当ててみましょう! –

+0

@kichはあなたのプログラムが遅すぎるか、サーバーが遅すぎますか? –

+0

私はサーバーが遅いと思っていますが、時にはそれは私に40kbpsの速度を与え、そうでなければ26mbpsの速度を与えます。私はサーバからダウンロードするのではなくオプションがあるので、サーバにpingをしてより速くダウンロードできる方法があるかどうか疑問に思っています。 – kich

答えて

0

をmutlprocessing行うことができます - グローバルなインタプリタロックはパフォーマンスに多大な影響を与えません

関連する問題