大型JSON数据的内存问题

时间:2012-06-29 16:44:37

标签: ios json

我的公司创建了一个由iPad应用程序使用的Web服务,并且内部没有iOS开发经验,我们承包了这项工作。

作为初始化过程的一部分,应用程序以JSON格式从Web服务接收一组起始数据。对于大多数应用程序用户而言,此数据集大小约为4 MB(未压缩),应用程序可以毫无问题地处理此问题。

对于较小的用户组,数据大小要大得多,大约65 MB未压缩。使用此数据集,iPad应用程序崩溃,开发人员声称应用程序正在被杀死,因为它使用了太多内存。如果我理解正确,他们会说在尝试将JSON解析为内存中对象时会发生这种情况。

我的感觉是,具有1 GB内存的设备在处理65 MB数据时应该没有问题,但我没有使用iOS环境的经验。

有没有人能够在iOS中处理大量的JSON数据?如果问题是将整个JSON数据集加载到内存中,是否有一个用于iOS的流式JSON解析器会占用更少的内存?

1 个答案:

答案 0 :(得分:1)

我不相信问题是将json转换为NSDictionaries / NSArrays / NSStrings / NSNumbers。

我的猜测是你在紧密循环中使用带有自动释放对象的json的结果,例如在清空自动释放的池之前为所有图像创建缩略图。

如果它们不适合您的数据,您能否举例说明数据集的工作类型是什么?

这是非常糟糕的代码,因为它会继续将umcompressed uiimages堆叠到自动释放池中,直到所有图像都被下载并制作成缩略图后才会被击中。

NSArray* images = [jsonObject objectForKey:@"images"];

for(NSString* imageURL in images){
    NSURL* url = [NSURL URLWithString: imageURL];
    NSData* data = [NSData dataWithContentsOfURL: url];
    UIImage* image = [UIImage imageWithData: data];
    // write image to disk
    UIImage* thumbnail = CreateThumbnailFromImage(image);
    // write thumbnail to disk
}

可以通过添加另一个自动释放池来修复相同的代码,该池将更快地清理自动释放的对象。

for(NSString* imageURL in images){
    @autoreleasepool {
    NSURL* url = [NSURL URLWithString: imageURL];
    NSData* data = [NSData dataWithContentsOfURL: url];
    UIImage* image = [UIImage imageWithData: data];
    // write image to disk
    UIImage* thumbnail = CreateThumbnailFromImage(image);
    // write thumbnail to disk
    }
}