min*_*ank 3 ruby heroku nokogiri httparty sidekiq
我刚刚切换到在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%)
Run Code Online (Sandbox Code Playgroud)
它一直在增长.
对于这些工作,我正在使用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
Run Code Online (Sandbox Code Playgroud)
然后我尝试类似的东西:
page = HTTParty.get("http://site.com")
parser = Nokogiri::XML::SAX::Parser.new(LinkParser.new)
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用以下方法和我使用HTTParty检索的数据,但是无法使这些方法中的任何一个正常工作:
parser.parse(File.read(ARGV[0], 'rb'))
parser.parse_file(filename, encoding = 'UTF-8')
parser.parse_memory(data, encoding = 'UTF-8')
Run Code Online (Sandbox Code Playgroud)
我发现解析器没有工作,因为我正在调用parser.parse(page)而不是parser.parse(page.body) 我尝试使用上面的脚本打印出各种网站的所有html标签,而对于某些网站,它打印出所有标签,而对于其他网站,它只打印出几个标签.
如果我使用Nokogiri::HTML()而不是parser.parse()它工作正常.
我正在使用Nokogiri::XML::SAX::Parser.new()而不是Nokogiri::HTML::SAX::Parser.new()HTML文档,这就是我遇到麻烦的原因.
好的,我现在有以下代码工作,但无法弄清楚如何将我得到的数据放入一个我可以在以后使用的数组...
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
Run Code Online (Sandbox Code Playgroud)
最后我发现内存泄漏是由于'Typhoeus'宝石,它是我在部分代码中使用的'PageRankr'宝石的依赖.
我通过在监视内存使用情况的同时在本地运行代码watch "ps u -C ruby",然后测试代码的不同部分,直到我能够确定内存泄漏的来源,从而发现了这一点.
我将此标记为已接受的答案,因为在最初的问题中我不知道如何调试内存泄漏,但是有人告诉我要做上述操作并且它有效.
| 归档时间: |
|
| 查看次数: |
1845 次 |
| 最近记录: |