我正在开发一个需要存储大量2GB + XML文件进行处理的应用程序,我面临两个问题:
答案 0 :(得分:1)
大多数情况下,我们更喜欢解析已经被拉入内存的整个文件,因为它更容易来回跳转,提取这个以及我们的代码需要。因为它在内存中,如果需要,我们可以轻松地随机访问。
根据您的需要,您需要从文件的顶部开始,并阅读每一行,查找感兴趣的标签,直到您到达文件的末尾。为此,您需要使用Nokogiri::XML::SAX和Nokogiri::XML::SAX::Parser以及Nokogiri::XML::SAX::Document中的事件。以下是Nokogiri网站的摘要:
SAX样式解析器的基本工作方式是创建一个解析器,告诉解析器我们感兴趣的事件,然后给解析器一些XML进行处理。解析器会在遇到您想要了解的事件时通知您。
SAX与处理DOM不同,但它可以非常快,并且在内存上更容易。
如果您想以较小的块加载文件,可以在OpenURI.open
或Net::HTTP
块内处理XML,这样您就可以在TCP数据包大小的块中获取它。那么问题是你的线路可能会被分割,因为TCP不能保证按行读取,而是通过块读取,这就是你在读取循环中看到的内容。您的代码必须在缓冲区末尾剥离部分行,然后将它们添加到读缓冲区,以便下一个块读取完成该行。
答案 1 :(得分:0)
您需要一个流解析器。请查看https://github.com/craigambrose/sax_stream
您可以在EC2上运行自己的FTP服务器吗?或使用托管服务提供商,例如https://hostedftp.com/