我正在尝试在iPad上解析一个非常大的json文件。文件大小将在50到100 mb之间变化(有一个初始文件,每个月会有一组新的完整数据,这些数据将被下载,解析并保存到coredata中)
我正在为一家公司作为企业解决方案构建此应用程序- json文件包含敏感的客户数据,需要将其保存在本地的ipad上,因此即使离线也可以使用。当文件小于20mb时它可以工作,但是现在数据集变得更大了,我真的需要解析它。我在解析过程中收到内存警告,在第三次警告之后它崩溃了。我有几个不同的Core Data实体,我只是设置所有来自json文件的值(当应用程序首次启动时),完成所有操作后,我就在执行[context save]。
[context save]
我希望有人能给我一些有关如何处理如此大文件的建议。我当时正在考虑将json文件拆分为几个较小的json文件,并可能将它们解析为多个线程,但是我不知道这是否是正确的方法。我猜一个大问题是整个文件都保存在内存中- 也许有某种方式可以将其“流式传输”到内存中或类似的东西?
我正在使用JSONKit(https://github.com/johnezang/JSONKit)来解析文件,因为我已经读到它是最快的文件(也许有一个较慢的文件可以在内存上使用吗?)。
提前致谢。
1)将数据写入文件,然后使用NSData的 dataWithContentsOfFile:options:error: 并指定 NSDataReadingMappedAlways 和 NSDataReadingUncached 标志。这将告诉系统使用mmap()来减少内存占用量,而不是用内存块来负担文件系统缓存(这会使它变慢,但对iOS的负担要小得多)。
2)您可以使用YAJL SAX风格的JSON解析器在解码时获取对象。
注意:我尚未完成2),但已使用1)中包含的技术。
3)我自己最终需要这样的东西,并编写了可以与任何异步下载器(包括我自己的异步下载器)绑定的SAX-JSON-Parser- ForStreamingData。