1

我正在使用 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。

我已经到处寻找更好地分析这一点的方法(例如ruby​​/ruby on rails 内存泄漏检测),但我不明白如何使用它们中的任何一个。MemoryLogic 看起来很简单,但安装说明似乎缺少一些信息......

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

提前致谢!

4

2 回答 2

2

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

<foo attr="b" />

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

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

于 2012-05-15T12:41:06.043 回答
1

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

由于 heroku 对免费赠品的人施加的一些限制,我已经超时并且一直有东西在我身上失败。

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

编辑1:

顺便说一句,这也是什么?

open_uri_fetched = open(feed.fetch_url)

它正在获取的网址在哪里?它是在那里还是在真正的 Nokogiri 通话中出现问题。无论如何,这个提取需要多长时间?

于 2012-05-15T11:21:02.067 回答