Rails:对Heroku(也许是Nokogiri)的内存泄漏进行故障排除

时间:2012-05-15 10:39:22

标签: ruby-on-rails memory-leaks heroku nokogiri

我正在使用Rails 3.1.1并在Heroku上部署。我正在使用open-uri和Nokogiri。

我正在尝试解决在我尝试获取和解析xml文件时发生的内存泄漏(?)问题。我提取并尝试解析的XML Feed是32 Mb。

我正在使用以下代码:

require 'open-uri'   
open_uri_fetched = open(feed.fetch_url)
xml_list = Nokogiri::HTML(open_uri_fetched)

其中feed.fetch_url是外部xml文件。

似乎在使用Nokogiri(我的代码中的最后一行)解析xml_list时,内存使用量会爆炸,使用量高达540 Mb并继续增加。这似乎不合逻辑,因为XML文件只有32 Mb。

我一直在寻找更好地分析这种方法的方法(例如ruby/ruby on rails memory leak detection),但我无法理解如何使用它们。 MemoryLogic看起来很简单,但安装说明似乎缺少一些信息......

所以,请帮我确定上面的代码是否应该使用那么多内存或(超级简单)指令来查找内存泄漏。

提前致谢!

2 个答案:

答案 0 :(得分:2)

解析大型xml文件并将其转换为文档树通常会创建一个内存表示,该表示远远大于xml数据本身。考虑例如

<foo attr="b" />

只有16个字节长(假设单字节字符编码)。该文档的内存表示将包括一个表示元素本身的对象,可能是一个(空)子集合,一个包含至少一个东西的元素的属性集合。元素本身具有属性,例如其名称,指向其父文档的命名空间指针等。这些东西的数据结构可能会超过16个字节,甚至在它们被nokogiri包装在ruby对象中之前(每个都有一个内存占用几乎可以肯定> = 16个字节)。

如果您正在解析大型xml文件,那么您几乎肯定希望使用像SAX parser这样的事件驱动解析器来响应元素,因为它们在文档中遇到而不是在整个文档上构建树表示形式然后继续努力。

答案 1 :(得分:1)

你确定你没有遇到heroku允许“长时间运行的任务”的上限吗?

由于heroku对免费赠品人员的一些限制,我已经超时并且因为一些限制而一直失败。

我的意思是,你可以在你的开发中复制这个吗?您的机器需要多长时间才能完成您想要的操作?

编辑1:

顺便说一句,这是什么?

open_uri_fetched = open(feed.fetch_url)

它取道的网址在哪里?它是在那里bork还是实际的Nokogiri电话。这次获取需要多长时间?