【问题标题】:What's the most efficient way of converting a 10 MB JSON response into an NSDictionary?将 10 MB JSON 响应转换为 NSDictionary 的最有效方法是什么?
【发布时间】:2011-05-20 02:40:51
【问题描述】:

我们的应用程序必须以最少的远程 http 请求显示大量数据,因此我们在后端添加了一个端点,该端点以单个 json 响应的形式提供所有必要的数据。这会产生约 1.5MB(压缩)或大约 8MB 的未压缩 json 格式文本。

问题不大,它会在 10 到 30 秒内下载完毕,我们正在使用 ASIHTTPRequest 将整个响应写入磁盘。

现在有趣的部分来了——在将未压缩的文件读入内存映射字符串后,我们使用 stig 的json-framework 将其转换为 NSDictionary。这对于我们的应用程序的其余部分和我们其他 API 端点的典型 2 KB json 响应非常有效。但是,反序列化这 8 MB 的数据需要几秒钟(模拟器)到几分钟(3G 和第二代 iPod Touch)。

我正在研究读取所有这些数据的最佳方法。

我很想使用直接从后端提供的二进制 plist,但我们使用的是 Java,我还没有找到适合我们要求的库,而且在如此紧迫的期限内,编写自己的可能不是最好的想法。

如果有任何帮助,我们正在解析的 json 字符串主要是 X 项的数组,如下所示:

{
    "items": [ { "key1": "value1", "key2": "value2" },
               { "key1": "value1", "key2": "value2" },
               { "key1": "value1", "key2": "value2" },
               { "key1": "value1", "key2": "value2" },
               { "key1": "value1", "key2": "value2" },
               { "key1": "value1", "key2": "value2" }
             ]
}

将这个 8 MB json 格式的字符串读入内存中的 NSDictionary 最有效的方法是什么?

【问题讨论】:

  • 你能把它分割成更小的文件并按需读取每个文件吗?或者您是否一次需要全部 8 MB?
  • 必须选择:egads。你怎么能在这么小的屏幕上显示8MB的文字?我会选择另一种更有效的方法。
  • 不是一下子全部显示出来的。这是一个交互式电视节目指南,分为一个小时的块,每个块有 900 个频道。所以它是 ~7*24 顺序表视图,每个视图都有 >900 个程序。用户目前可能只需要前 4 个小时左右,但要求他必须能够不间断地获取其他任何日期/时间。最初我一次只下载 4 小时的数据,但是跟踪 Core Data 中可用以及需要下载的代码太复杂而无法维护,因此我们选择将所有数据下载到一通。

标签: iphone objective-c json cocoa-design-patterns


【解决方案1】:

看看JSONKit。它非常快,如果您的 JSON 有很多重复的键和值(这很常见),它的“最近实例化的对象缓存”将大大减少用于“最终”NSDictionary 的内存量。

【讨论】:

  • 非常酷。以前没见过这个。我很想知道 8MB 数据的速度有多快。
  • +1 我忘记了这个项目!感谢您的提醒。 :)
  • 使用 JSONKit 运行了一些基准测试并获得了 200% 的改进。很好的建议。
  • 修改了 Sam Soffes 的基准工具以使用我的 json 字符串运行。将本次运行的迭代次数减少到 10 次,稍后将在最初的 100 次时运行。JSONKit 领先:hram.us/3VPL
  • 有快速入门的 JSONKit 教程吗?
【解决方案2】:

虽然 JSONKit 比 YAJL 快,但 YAJL 支持解析流。您应该能够将它与 ASIHTTPRequest 连接起来,以便在它下载它的同时解析 JSON 。在此处查看标记为“在数据可用时进行文档样式解析”的部分:

http://gabriel.github.com/yajl-objc/

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2018-11-30
    • 2020-10-24
    • 2020-12-25
    相关资源
    最近更新 更多