【问题标题】:Memory problems with large JSON data大型 JSON 数据的内存问题
【发布时间】:2012-06-29 16:44:37
【问题描述】:

我的公司创建了一个供 iPad 应用使用的 Web 服务,但我们内部没有 iOS 开发经验,因此我们将这项工作外包出去。

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

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

我的感觉是 1 GB 内存的设备在处理 65 MB 数据时应该不会有问题,但我没有 iOS 环境的经验可以以此为基础。

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

【问题讨论】:

  • 你看过 RestKit。异步数据得到处理。在我们公司工作,我们处理来自 Web 服务的大量 JSON。此外,短期解决方案可能是以固定大小的小数据包发送数据。更易于处理和使用。
  • 在 WWDC 2012 上,Apple 表示 iPad 3 有 650MB 的硬内存限制(如果超过 watchdog 会杀死你的应用程序),但没有其他设备有硬限制。但无论如何,你不能只发送 10MB 的 JSON 数据,让应用一次处理一个吗?
  • 最好的解决方案是分块传递数据,这样可以解决问题并加快处理速度。
  • @RoboticCat 谢谢你的信息。如果分解 JSON 是微不足道的,我会这样做并继续前进。不幸的是,情况并非如此,我觉得我不得不推迟,因为我无法理解应用程序如何耗尽内存。
  • @adrift 我同意回击。当然,这取决于开发人员正在测试的设备,但如果是 iPad 3,我会非常怀疑 65MB 的数据是否超过了 650MB 的限制。他们是否可以将代码发送给您以供审查,或者至少向您发送来自 Instruments 的分配跟踪,以证明分配了超过 650MB 的脏内存(并且应该通过审查错误跟踪来证明 Watchdog 正在杀死应用程序)。

标签: ios json


【解决方案1】:

我认为问题不在于将 json 转换为 NSDictionaries/NSArrays/NSStrings/NSNumbers。

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

如果它们不符合您的数据正在执行的操作,您能否举例说明正在对数据集执行什么类型的工作?

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

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
    }
}

【讨论】:

  • JSON 响应中的数据存储在数据库中。我不知道实施细节,因为这项工作是由承包商执行的。有问题的数据并不复杂——所有的字符串、日期或数值。您能否详细说明自动释放池是什么?我确实问过是否有可能分配了内存但没有释放,并确信这不是问题。
  • 使我的回答更加清晰。
猜你喜欢
  • 2021-07-03
  • 2019-12-25
  • 2019-03-25
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多