0

我编写了一个从文件中检查 url 的脚本(使用 ruby​​ gem 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
4

2 回答 2

0

正如您建议的那样,我已经对我的代码进行了改进,我正在批量处理 hydra 的 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
于 2012-04-06T15:24:43.250 回答
0

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

于 2012-04-04T13:31:51.407 回答