我编写了一个脚本来检查文件中的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
答案 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