对于DOM解析器,什么大小的xml文件应该被认为太大?

时间:2013-01-14 23:01:31

标签: android ios xml dom sax

我一直在为iOS和Android开发一个相当简单的应用程序,它解析本地xml以形成项目列表并显示有关它们的信息。在查看我的解析选项时,我确定了用于android的本机SAX解析器,以及内置于objective-C的NSXMLparser类。在查看我的选项时,我反复看到人们说DOM解析器不适合大型xml文件。然而,没有人确切地定义了“大”意味着什么。在应用程序的更高版本中,我正在考虑切换到DOM解析器。

我的问题是:你在哪里画线,并删除DOM解析器作为选项?有问题的平台是iOS和Android,当然这两个平台仍然有很多旧设备。因此,假设设备的速度低于平均值,那么绘制的线条在哪里?

感谢您的考虑。

2 个答案:

答案 0 :(得分:8)

DOM解析器必须将整个XML加载到内存中。此外,与原始XML的大小相比,解析的XML通常占用5x-10x内存。

如果您知道应用程序的允许内存消耗是N兆字节的RAM,那么您可以自己绘制该行:将N除以10.

例如,如果您不想超过10MB的RAM,那么您的XML不应超过1MB。

只有最新的设备有1GB的RAM(在所有应用程序中分开),旧设备有512MB甚至256MB。 256MB / 10 = 25MB。您可能不希望占用超过10%的内存,因此所有平台上支持的DOM XML超过2.5MB都是太多了。

但是,这只是经验法则,只有现实生活测试可以告诉你真相。

答案 1 :(得分:1)

什么太大了?它取决于您拥有多少工作记忆,这些记忆因设备而异。在iPhone上,在3GS上,你只有256MB,iPhone 4有512MB,而iPhone 5有1GB。

顺便说一句,虽然NSXMLParser是SAX解析器,但如果使用initWithContentsOfURL,它会在解析开始之前将整个feed加载到内存中。因此,您遭受类似DOM的强烈内存消耗,但是具有类似SAX的繁琐接口。因此,如果你看看Apple的PerformanceXML sample,当他们说明一个小型的流式SAX解析器时,它们会回归LibXML2,它会很好地传输。使用NSXMLParser时,我也通过将NSURLConnection包裹在NSInputStream中来实现类似的效果,因此我可以致电initWithStream并享受NSXMLParser SAX解析器启用的小内存占用。

简而言之,在解析非常大的XML文件时,请确保您的SAX解析器仍然不会过度消耗内存,但要么使用LibXML2,要么使用NSXMLParserNSInputStream

对我来说,这是完全随意的,如果XML超过1MB,我将使用流式SAX解析器LibXML2。如果它那么大,我就不会使用DOM解析器,也不会使用NSXMLParser

另见Ray Wenderlich的How to Choose the Best XML Parser for Your iPhone Project