2012-04-04 3 views
0

私はruby gem Typhoeusを使ってファイルからURLをチェックするスクリプトを書いた。なぜコードを実行するとメモリ使用量が増えるのか分かりません。通常、10000回後にスクリプトのクラッシュが発生します。 解決方法はありますか?あなたの助けを前にありがとう。 マイコード:Typhoeus Hydraのメモリが足りなくなった

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

'#check_website'とは何ですか? –

答えて

0

一つのアプローチは、あなたのファイル処理を適応するかもしれない - (一度に言う5000)の代わりに、ファイルから行を読んで、すぐにリクエストオブジェクトを作成するのではなく、バッチでそれらを処理しようとすると、スロットルあなたの要求率/メモリ消費量。

+0

私はそれについて考えましたが、 'request.destroy'のようにsthをやりたいと思っています。 (私はそれをコードに追加しましたが動作しません) – ypcat

+0

ええと...ヒドラはリクエストを実行するために実際にリクエストのコピーを持っていなければならないので、ローカルリクエストオブジェクトを破壊しても、少なくともhydra.runが呼び出されるまでコピーしてください。存在しないリクエストでリクエストを実行する方法はありません。 – vengeance

0

ヒドラへの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 
関連する問題