Typhoeus Hydra记忆力不足

时间:2012-04-04 13:08:44

标签: ruby hydra typhoeus

我编写了一个脚本来检查文件中的URL(使用ruby gem Typhoeus)。我不知道为什么当我运行我的代码时内存使用量增长。通常在10000 urls脚本崩溃后。 它有什么解决方案吗?在此先感谢您的帮助。 我的代码:

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 个答案:

答案 0 :(得分:0)

一种方法可能是调整文件处理 - 而不是从文件中读取一行并立即创建请求对象,尝试批量处理它们(比如一次5000个)并限制请求率/内存消耗。 / p>

答案 1 :(得分:0)

我已经改进了我的代码,因为你建议我正在批量处理urra。 它适用于正常的内存使用,但我不知道为什么在大约1000个网址之后它就会停止获取新内存。这很奇怪,没有错误,脚本仍在运行,但它不发送/获取新请求。我的代码:

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