2012-03-30 65 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多线程 - 全局解释锁不会影响数据的性能产生很大

相关问题