Тайфус Гидра не хватает памяти

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

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

2 ответа

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

Я улучшил свой код, так как вы предлагаете, чтобы я обрабатывал ссылки на гидру партиями. Он работает с обычным использованием памяти, но я не знаю, почему после примерно 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
Другие вопросы по тегам