【问题标题】:Storing and processing large XML files with Heroku?使用 Heroku 存储和处理大型 XML 文件?
【发布时间】:2013-04-16 21:23:20
【问题描述】:

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

  1. 如何处理文件?一次将整个文件加载到 Nokogiri 是行不通的。它很快就会耗尽内存,据我所知,这个过程会从轨道上被摧毁。是否有与 Heroku 兼容的方法可以快速/轻松地以较小的块读取位于非 Heroku 服务器上的大型 XML 文件?
  2. 如何存储文件?该站点设置为使用 S3,但数据提供者需要 FTP 访问权限才能每晚上传 XML 文件。通过 FTP 的 S3 显然是不可行的,并且将文件存储在 Heroku 上也不起作用,因为它只会被拥有它的 dyno 看到并且容易被随机清除。以前有没有人遇到过这种类型的限制,如果有,您是如何解决的?

【问题讨论】:

  • 使用扩展的 VTD-XML,您可以对最大 256GB 的 xml 文件执行 xpath(全套)。

标签: ruby xml heroku xml-parsing storage


【解决方案1】:

大多数时候,我们更喜欢解析已拉入内存的整个文件,因为这样更容易来回跳转,根据代码需要提取这个和那个。因为它在内存中,如果我们愿意,我们可以轻松地进行随机访问。

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

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

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

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

【讨论】:

    【解决方案2】:
    1. 您需要一个流解析器。看看https://github.com/craigambrose/sax_stream

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

    【讨论】:

      猜你喜欢
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      相关资源
      最近更新 更多