Heroku で Sidekiq を使用するように切り替えたばかりですが、しばらくジョブを実行すると、次のようになります。
2012-12-11T09:53:07+00:00 heroku[worker.1]: Process running mem=1037M(202.6%)
2012-12-11T09:53:07+00:00 heroku[worker.1]: Error R14 (Memory quota exceeded)
2012-12-11T09:53:28+00:00 heroku[worker.1]: Error R14 (Memory quota exceeded)
2012-12-11T09:53:28+00:00 heroku[worker.1]: Process running mem=1044M(203.9%)
そんな感じで伸び続けています。
これらのジョブでは、Nokogiri と HTTParty を使用して URL を取得し、解析しています。いくつかのコードを変更しようとしましたが、そもそも何を探しているのか実際にはわかりません。これをデバッグするにはどうすればよいですか?
アプリに New Relic を追加しようとしましたが、残念ながらまだ Sidekiq をサポートしていません。
また、グーグルの後、SAXパーサーに切り替えて、それが機能するかどうかを確認しようとしていますが、行き詰まっています。これは私がこれまでに行ったことです:
class LinkParser < Nokogiri::XML::SAX::Document
def start_element(name, attrs = [])
if name == 'a'
puts Hash[attrs]['href']
end
end
end
次に、次のようなことを試します。
page = HTTParty.get("http://site.com")
parser = Nokogiri::XML::SAX::Parser.new(LinkParser.new)
次に、HTTParty を使用して取得したデータで次のメソッドを使用しようとしましたが、これらのメソッドのいずれも正しく機能させることができませんでした。
parser.parse(File.read(ARGV[0], 'rb'))
parser.parse_file(filename, encoding = 'UTF-8')
parser.parse_memory(data, encoding = 'UTF-8')
アップデート
parser.parse(page)
代わりに呼び出していたため、パーサーが機能していないことがわかりparser.parse(page.body)
ましたが、上記のスクリプトを使用してさまざまな Web サイトのすべての html タグを印刷しようとしましたが、一部のサイトではすべてのタグが印刷され、他のサイトでは印刷のみが行われましたいくつかのタグを出します。
Nokogiri::HTML()
代わりに使用すると正常にparser.parse()
動作します。
HTML ドキュメントNokogiri::XML::SAX::Parser.new()
の代わりにを使用していたため、問題が発生していました。Nokogiri::HTML::SAX::Parser.new()
コードの更新
OK、次のコードが機能するようになりましたが、取得したデータを後で使用できる配列に入れる方法がわかりません...
require 'nokogiri'
class LinkParser < Nokogiri::XML::SAX::Document
attr_accessor :link
def initialize
@link = false
end
def start_element(name, attrs = [])
url = Hash[attrs]
if name == 'a' && url['href'] && url['href'].starts_with?("http")
@link = true
puts url['href']
puts url['rel']
end
end
def characters(anchor)
puts anchor if @link
end
def end_element(name)
@link = false
end
def self.starts_with?(prefix)
prefix.respond_to?(:to_str) && self[0, prefix.length] == prefix
end
end