Тайфус Гидра не хватает памяти
Я написал скрипт, который проверяет 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