【问题标题】:How to parse a huge XML file any not run out of memory如何解析一个巨大的 XML 文件,任何一个都不会耗尽内存
【发布时间】:2016-08-01 21:03:21
【问题描述】:

我的应用程序可以导入 GPX 文件 (XML),然后我使用出色的 XML Dictionary 库,它在解析 XML 和 GPX 方面做得非常出色,但在这种情况下,我有一个 85MB 的文件,我想尝试解析。它包含超过 16,000 个巨大的 GPX 航路点。

目前我将NSURL 读入NSData,然后使用解析器。但我在尝试使用大文件时收到内存警告和崩溃。

如何分块解析这样的大文件,以免出现内存错误?

【问题讨论】:

    标签: ios objective-c xml gpx


    【解决方案1】:

    您使用的 XML 字典库的问题在于它构建了整个 XML 文件的庞大对象树。这会占用大量内存。

    最好使用 SAX 解析器,例如标准的 NSXMLParser 类。除了您在解析过程中保留的任何数据结构之外,没有任何内容保留在内存中。

    在任何一种情况下,您都不需要在解析之前将整个 XML 文件加载到内存中。打开文件流并将流传递给解析器。

    【讨论】:

    • XML Dictionary 确实使用了NSXMLParser。他们有什么不同?
    • 阅读github项目主页上的描述。 XML Dictionary 正在构建一个表示整个 XML 文档的巨大对象树。除了NSXMLParser 正在做的事情之外,所有这些额外的开销都会导致内存问题。您基本上在内存中有 3 个 XML 文件的副本。 1) 整个文件的完整NSData。 2) XML Dictionary 构建的巨树。 3) 处理解析后的 XML 后自己的数据模型。 #1 可以通过打开 XML 文件的流而不是将整个文件加载到内存中来避免。你可以通过使用 NSXMLParser 来避免 #2。
    • 是否有任何帮助类可以做到这一点?我发现很少有关于以您提到的方式使用NSXMLParser 打开流的信息。
    • 查看NSXMLParser initWithStream: 的文档。然后查看NSInputStream 的文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2016-12-25
    相关资源
    最近更新 更多