2013-04-16 27 views
2

我的工作,需要存储用于处理大量2GB + XML文件的应用程序,并且我面临两个问题:用Heroku存储和处理大型XML文件?

  1. 如何处理该文件?一次将整个文件加载到Nokogiri中将不起作用。它很快消耗了记忆,据我所知,这个过程从轨道上消失。是否有与Heroku兼容的方法来以较小的块快速/轻松地读取位于非Heroku服务器上的大型XML文件?
  2. 如何存储文件?该网站设置为使用S3,但数据提供商需要通过FTP访问每晚上传XML文件。通过FTP的S3显然是不可行的,并且将文件存储在Heroku上也不起作用,因为它只会被拥有它的测试仪看到,并且容易被随机清除。有没有人遇到过这种类型的约束,如果是的话,你是怎么解决它的?
+0

使用扩展的VTD-XML,您可以在xml文件(最大256GB)上执行xpath(全集)。 –

回答

1

多数时候我们喜欢解析已被拉入内存,因为它更容易来回跳转,提取这一点,作为我们的代码需要整个文件的时间。因为它在内存中,所以我们可以很容易地进行随机访问,如果我们想。

为了您的需要,您需要从文件的顶部开始,读取每一行,查找感兴趣的标签,直至到达文件末尾。为此,您希望使用Nokogiri::XML::SAXNokogiri::XML::SAX::Parser以及Nokogiri::XML::SAX::Document中的事件。这里是做什么的,从引入nokogiri的网站摘要:

一个SAX风格的解析器的基本工作方式是通过创建一个解析器,讲述我们感兴趣的事件分析器,然后给解析器一些XML处理。解析器会在你遇到你说你想知道的事件时通知你。

SAX是与处理DOM不同的野兽,但它可以非常快速,并且在内存上更容易。

如果您想以较小的块加载文件,您可以在OpenURI.openNet::HTTP块内处理XML,因此您可以使用TCP数据包大小的块来获取它。问题在于你的行可能会被分割,因为TCP不能保证通过行读取,而是通过块来读取,这是你在读取循环内部看到的。您的代码必须在缓冲区末尾剥离部分行,然后将它们添加到读取缓冲区,以便下一个块读取完成该行。