gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:30:57 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

The basic way a SAX style parser works is by creating a parser, telling the parser about the events we’re interested in, then giving the parser some XML to process. The parser will notify you when it encounters events your said you would like to know about.

SAX 与处理 DOM 不同,但它速度非常快,而且更容易内存。

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

关于ruby - 使用 Heroku 存储和处理大型 XML 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16047358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com