2012-04-04 4 views
0

Я написал сценарий, который проверяет URL-адреса из файла (используя рубиновый камень Typhoeus). Я не знаю, почему, когда я запускаю свой код, использование памяти увеличивается. Обычно после 10000 ошибок скрипта URL. Есть ли какое-нибудь решение? Заранее спасибо за вашу помощь. Мой код:Typhoeus Hydra исчерпал память

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

Что делает '# check_website'? –

ответ

0

Один из подходов может адаптировать обработку файлов - вместо чтения строки из файла и сразу же создает объект запроса, попробуйте их обработку в пакетном режиме (скажем 5000, в то время) и дроссельной заслонки ваш расход/потребление памяти.

+0

Я думал об этом, но скорее хотел бы сделать так, как 'request.destroy'. (Я добавил его в код, но он не работает.) – ypcat

+0

Да, у гидры действительно есть копия запроса на выполнение запроса, поэтому, даже если вы уничтожите локальный объект запроса, гидра все равно будет удерживать скопируйте, по крайней мере, до тех пор, пока не будет вызван hydra.run - просто нет способа выполнить запрос с несуществующим запросом. – vengeance

0

Я улучшил свой код, так как вы предлагаете мне обрабатывать URL-адреса в гидрах партиями. Он работает с обычным использованием памяти, но я не знаю, почему после примерно 1000 URL-адресов он просто перестает получать новые. Это очень странно, ошибок нет, скрипт все еще работает, но он не отправляет/не получает новые запросы. Мой код:

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 
Смежные вопросы