2

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

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

2 回答 2

1

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

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

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

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

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

于 2013-04-17T04:19:37.177 回答
0
  1. 你需要一个流解析器。看看https://github.com/craigambrose/sax_stream

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

于 2013-04-16T21:32:11.110 回答