我一直在为iOS和Android开发一个相当简单的应用程序,它解析本地xml以形成项目列表并显示有关它们的信息。在查看我的解析选项时,我确定了用于android的本机SAX解析器,以及内置于objective-C的NSXMLparser类。在查看我的选项时,我反复看到人们说DOM解析器不适合大型xml文件。然而,没有人确切地定义了“大”意味着什么。在应用程序的更高版本中,我正在考虑切换到DOM解析器。
我的问题是:你在哪里画线,并删除DOM解析器作为选项?有问题的平台是iOS和Android,当然这两个平台仍然有很多旧设备。因此,假设设备的速度低于平均值,那么绘制的线条在哪里?
感谢您的考虑。
答案 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
,要么使用NSXMLParser
和NSInputStream
。
对我来说,这是完全随意的,如果XML超过1MB,我将使用流式SAX解析器LibXML2
。如果它那么大,我就不会使用DOM解析器,也不会使用NSXMLParser
。
另见Ray Wenderlich的How to Choose the Best XML Parser for Your iPhone Project