我正在使用cocoa开发一个应用程序。我需要解析一个大尺寸(大约25Mb)的iTunes XML文件。我现在使用以下代码片段 NSDictionary * itunesDatabase = [NSDictionary dictionaryWithContentsOfFile:itunesPath]; 但这有点慢 有没有更快的方法将整个数据加载到字典?
答案 0 :(得分:3)
你的性能如此缓慢是因为NSDictionary
一次性将所有内容都读入内存。对于大型iTunes资料库,这可能需要很长时间,并且随时可以使用活动监视器来确认这一点 - 一个公制的内存量。 (这是该记忆量的精确技术术语)
在这些情况下的替代方案是使用基于回调的XML解析器(通常称为“SAX”解析器)。这些解析XML文档一次一个实体并调用您的回调方法。在Cocoa中,NSXMLParser
类提供此功能。您将类设置为其委托,调用parse
方法,解析器在读取XML文件中的标记,属性,文本等时开始调用委托方法。
现在,这显然比仅将所有内容加载到NSDictionary
并走过生成的对象树更难。您需要自己跟踪状态信息。而且你必须逐步“建立”你的对象,因此组织你的课程可能很困难。
但是,您可以忽略您不感兴趣的XML,这样可以节省大量内存。而且,根据您从iTunes中获取的数据,您也可以在获得所需数据后立即结束解析。即使这最终花了很长时间,至少你可以向你的用户显示一个进度条或其他指示你的程序正在工作,这比只挂10-20秒更好{{{ 1}}加载一个巨大的XML文件。
答案 1 :(得分:0)
如果您能够使用第三方框架,请运行,不要走到EyeTunes。 (BSD许可证。)它是Apple Events与iTunes通信的抽象层,因此它不会直接解析XML数据库(我想,自从我使用它以来已经有一段时间了),但你会有获取/设置对XML中任何内容的访问权限。
答案 2 :(得分:0)
尝试使用libxml:
http://www.cimgf.com/2008/08/18/cocoa-tutorial-libxml-and-xmlreader/
要最大限度地减少内存占用,请在循环中创建并排空NSAutoreleasePool