【问题标题】:Speed Issue with sqlite and core data on the iPhoneiPhone 上 sqlite 和核心数据的速度问题
【发布时间】:2011-08-21 13:55:53
【问题描述】:

我在一个 sqlite db 表中有 40,000 多条记录,并且正在使用核心数据对数据进行建模。

当部署到设备 (iPhone 3G) 时,数据加载速度非常慢(数据加载到 tableview 需要 5 秒)。我想知道是否有人对如何改进这一点有任何提示。我听说过要为数据编制索引,但不确定这是如何完成的。

感谢您的帮助。

【问题讨论】:

  • 您是否对代码进行了剖析以找出减速的​​确切位置?
  • 不,我没有。我必须弄清楚才能做到这一点。可能是用 Instruments 或 Shark 完成的吗?谢谢。
  • 这是一个非常笼统的问题,我们不可能知道给出的信息发生了什么。但是,话虽如此,您是否看过省长?信息在:developer.apple.com/library/mac/#documentation/cocoa/conceptual/…
  • 所有 40k+ 的记录都在 tableview 中可见吗?
  • Shark 是一个很好的起点。还要考虑通过将基于核心数据的源替换为硬编码源来仅显示任何 40,000 行表视图是否存在问题。

标签: iphone objective-c sqlite uitableview core-data


【解决方案1】:

...40K 记录被分成 70+ 类别,最任何的tableview 将显示 2000 条记录。这 类别在一个 plist 中,然后 使用指向 sqlite 数据库 NSFetchedResultsController。

这听起来像是一个瓶颈。首先,在读入 plist 时,类别必须立即全部加载到内存中。根据类别对象/数据的大小,这可能会占用相当多的内存。

更重要的是,它表明您的数据模型配置不正确。核心数据模型外部应该不需要任何重要数据。类别数据应该是数据模型的一部分。如果您使用大量外部数据来配置 fetched results 控制器,那么您最终可能会遇到复杂、缓慢的 fetch 请求谓词。那将使一切陷入困境。

配置良好,Core Data 可以轻松处理非常大和复杂的数据集,因为数据只能以小块的形式读取。

【讨论】:

  • 另外,不要忘记启用批量提取,这只会导致在任何给定时间将数据库的一小部分加载到内存中。为此,在您的 NSFetchRequest 上使用 -setFetchBatchSize:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
相关资源
最近更新 更多