2013-06-10 19 views
5

Ho uno script Python molto semplice che utilizza gevent.pool per scaricare gli URL (vedi sotto). Lo script funziona bene per un paio di giorni e poi si blocca. Ho notato che l'utilizzo della memoria è molto alto in quel momento. Sto usando gevent in modo errato?Script Python con Gevent Pool, consuma molta memoria, si blocca

import sys 

from gevent import monkey 
monkey.patch_all() 
import urllib2 

from gevent.pool import Pool 

inputFile = open(sys.argv[1], 'r') 
urls = [] 
counter = 0 
for line in inputFile: 
    counter += 1 
    urls.append(line.strip()) 
inputFile.close() 

outputDirectory = sys.argv[2] 

def fetch(url): 
    try: 
     body = urllib2.urlopen("http://" + url, None, 5).read() 
     if len(body) > 0: 
      outputFile = open(outputDirectory + "/" + url, 'w') 
      outputFile.write(body) 
      outputFile.close() 
      print "Success", url 
    except: 
     pass 

pool = Pool(int(sys.argv[3])) 
pool.map(fetch, urls) 
+0

Sembra una perdita di memoria in 'gevent'. Un rapido google per "python gevent memory leak" restituisce un numero sorprendentemente alto di hit, sebbene tu sia probabilmente in una posizione migliore per determinare se qualcuno di essi si applica al caso specifico. – Aya

risposta

2
 body = urllib2.urlopen("http://" + url, None, 5).read() 

Sopra riga si legge l'intero contenuto nella memoria come una stringa. Per evitare ciò, cambia fetch() nel modo seguente:

def fetch(url): 
    try: 
     u = urllib2.urlopen("http://" + url, None, 5) 
     try: 
      with open(outputDirectory + "/" + url, 'w') as outputFile: 
       while True: 
        chunk = u.read(65536) 
        if not chunk: 
         break 
        outputFile.write(chunk) 
     finally: 
      u.close() 
     print "Success", url 
    except: 
     print "Fail", url 
+0

con open (...) come outputFile ... invece di provare – zinking

Problemi correlati