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



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

我正在尝试解决在尝试获取和解析 xml 文件时发生的内存泄漏 (?(。我正在获取并尝试解析的 XML 提要是 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。

我已经四处寻找更好地分析的方法(例如,轨道上的红宝石/红宝石内存泄漏检测(,但我不明白如何使用它们中的任何一个。内存逻辑看起来很简单,但安装说明似乎缺少一些信息......

因此,请帮助我确定上面的代码是否应该使用那么多内存或有关如何查找内存泄漏的(超级简单(说明。

提前感谢!

解析大型 xml 文件并将其转换为文档树通常会创建一个比 xml 数据本身大得多的内存表示形式。例如考虑

<foo attr="b" />

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

如果要分析大型 xml 文件,则几乎肯定希望使用事件驱动的解析器(如 SAX 解析器(,该解析器在文档中遇到元素时响应元素,而不是在整个文档上构建树表示形式,然后对其进行处理。

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

我已经超时了,由于heroku对免费赠品人员的一些限制,我的东西一直在失败。

我的意思是,你能在你的开发中复制这个吗?在您的机器上做您想做的事情需要多长时间?

编辑 1:

顺便问一下,这也是什么?

open_uri_fetched = open(feed.fetch_url)

它要获取的网址在哪里?是在那里还是在实际的Nokogiri电话上。无论如何,此提取需要多长时间?

最新更新