使用Heroku存储和处理大型XML文件?

时间:2013-04-16 21:23:21

标签: ruby xml heroku xml-parsing storage

我正在开发一个需要存储大量2GB + XML文件进行处理的应用程序,我面临两个问题:

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

2 个答案:

答案 0 :(得分:1)

大多数情况下,我们更喜欢解析已经被拉入内存的整个文件,因为它更容易来回跳转,提取这个以及我们的代码需要。因为它在内存中,如果需要,我们可以轻松地随机访问。

根据您的需要,您需要从文件的顶部开始,并阅读每一行,查找感兴趣的标签,直到您到达文件的末尾。为此,您需要使用Nokogiri::XML::SAXNokogiri::XML::SAX::Parser以及Nokogiri::XML::SAX::Document中的事件。以下是Nokogiri网站的摘要:

  

SAX样式解析器的基本工作方式是创建一个解析器,告诉解析器我们感兴趣的事件,然后给解析器一些XML进行处理。解析器会在遇到您想要了解的事件时通知您。

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

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

答案 1 :(得分:0)

  1. 您需要一个流解析器。请查看https://github.com/craigambrose/sax_stream

  2. 您可以在EC2上运行自己的FTP服务器吗?或使用托管服务提供商,例如https://hostedftp.com/