2012-04-04 14 views
0

Ich schrieb ein Skript, das URLs von Datei überprüft (mit Rubin Juwel Typhoeus). Ich weiß nicht, warum, wenn ich meinen Code ausführe, die Speichernutzung wächst. In der Regel stürzt nach 10000 URLs Skript ab. Gibt es eine Lösung dafür? Vielen Dank im Voraus für Ihre Hilfe. Mein Code:Typhoeus Hydra keinen Speicher mehr

require 'rubygems' 
require 'typhoeus' 

def run file 
    log = Logger.new('log') 
    hydra = Typhoeus::Hydra.new(:max_concurrency => 30) 
    hydra.disable_memoization 
    File.open(file).each do |url| 
    begin 
     request = Typhoeus::Request.new(url.strip, :method => :get, :follow_location => true) 
     request.on_complete do |resp| 
     check_website(url, resp.body)   
     end 
     puts "queuing #{ url }" 
     hydra.queue(request) 
     request.destroy 
    rescue Exception => e 
     log.error e 
    end 
    end 
    hydra.run 
end 
+0

Was macht die '# check_website'? –

Antwort

0

Ein Ansatz könnte sein, Ihre Dateiverarbeitung anzupassen - stattdessen eine Zeile aus der Datei zu lesen und sofort das Request-Objekt erstellen, versuchen, sie in den Reihen (etwa 5000 zu einem Zeitpunkt) Verarbeitung und Drossel Ihre Anfrage Rate/Speicherverbrauch.

+0

Ich habe darüber nachgedacht, aber ich würde lieber tun, wie 'request.destroy'. (Ich habe es Code hinzugefügt, aber es funktioniert nicht.) – ypcat

+0

Ja ... Hydra muss tatsächlich eine Kopie der Anfrage haben, um die Anfrage durchzuführen, also, selbst wenn Sie das lokale Anfrageobjekt zerstören, wird Hydra immer noch auf einem halten Kopieren Sie mindestens bis hydra.run aufgerufen wird - es gibt einfach keine Möglichkeit, eine Anfrage mit einer nicht existierenden Anfrage auszuführen. – vengeance

0

Ich habe Verbesserungen an meinem Code vorgenommen, da Sie vorschlagen, dass ich URLs in Chargen in Hydra umwandle. Es funktioniert mit normaler Speicherauslastung, aber ich weiß nicht, warum nach etwa 1000 URLs es nur neue bekommen. Das ist sehr merkwürdig, keine Fehler, das Skript läuft noch, aber es werden keine neuen Anfragen gesendet. Mein Code:

def run file, concurrency 
     log = Logger.new('log') 
     log.info '*** Hydra started ***' 
     queue = [] 
     File.open(file).each do |uri| 
     queue << uri 
      if queue.size == concurrency * 5 
      hydra = Typhoeus::Hydra.new(:max_concurrency => concurrency) 
      hydra.disable_memoization 
      queue.each do |url| 
      request = Typhoeus::Request.new(url.strip, :method => :get, :follow_location => true, :max_redirections => 2, :timeout => 5000) 
      request.on_complete do |resp| 
      check_website(url, resp.body) 
       puts "#{url} code: #{resp.code} curl_msg #{resp.curl_error_message}" 
      end 
      puts "queuing #{url}" 
      hydra.queue(request) 
      end 
      puts 'hydra run' 
      hydra.run 
      queue = [] 
     end 
     end 
     log.info '*** Hydra finished work ***' 
    end