【问题标题】:How to improve large data import performance with core data in iosios如何利用核心数据提高大数据导入性能
【发布时间】:2012-02-06 22:59:59
【问题描述】:

在首次启动 iOS 应用程序时,我从 Web 服务导入了大约 18,000 条相互关联的各种实体的记录。这些记录具有来自网络数据库的自己的唯一标识符。我反复阅读了苹果的文档、cimgf 的博客文章、Marcus Zarra 的核心数据书籍,并一遍又一遍地观看了 iDeveloper TV 的核心数据系列。如果不将实体 B、C 和 D 保留在内存中或执行昂贵的提取并维护实体之间的关系,我无法找到导入实体 A 的方法。如果我不使用核心数据,我可以只使用已经建立的唯一标识符,并且导入会更快。

如果您有任何建议,我会全力以赴。

我们已在 Android 中实施此策略,导入需要约 2.5 分钟,而在不同设备上的硬件相当的 iOS 上,导入需要约 6 分钟。缩短导入时间对我们的用户来说至关重要,所以我无法在这个问题上妥协。提前感谢您的帮助。

编辑:

这是我目前的做法 - 我创建了一个 NSOperation 来创建它自己的上下文。我首先导入实体 B、C 和 D,并为每个实体类型保留一个数组。然后我导入实体 A 并使用谓词过滤实体 B、C 和 D 的数组,以便将实体 A 与 B、C 和 D 中的适当实体相关联。我以优化的间隔批量保存上下文根据我当前导入的实体类型而有所不同。

我不只是导入一个表,我正在导入许多相互关联的表。因此,如果我导入实体 B,我必须将实体 B 保留在内存中,或者在需要将实体 B 与实体 A 关联时获取它。有意义吗?

【问题讨论】:

  • 我用更多信息编辑了这个问题。
  • 数据是什么?它是每个用户唯一的还是每个人都有相同的 18k 记录?
  • 每个用户唯一。由于用户也使用应用程序,因此我必须在初始同步后进行增量同步。
  • @RossChapman +1 回答您的问题。这很有趣。我有兴趣购买关于 CD 的 iDeveloper'TV 系列。你能说点什么吗?提前谢谢你。
  • 强烈推荐,并发编程、核心动画、单元测试系列。我从这些书上学到的东西比我读过的书要多,但我从视频中学到的东西比书本上的要好,所以你的里程可能会有所不同。

标签: ios sqlite core-data


【解决方案1】:

听起来你正在经历这个家伙所经历的同样痛苦,他最终撕掉了核心数据。一定有更好的方法! http://inessential.com/2010/02/26/on_switching_away_from_core_data

【讨论】:

  • 和 Brent Simmons 的想法完全一样。在开始大项目之前,不要选择错误的技术,以节省时间并获得更好的结果,这一点非常重要。感谢您发布此链接!
【解决方案2】:

我将提出每个 Core Data 问题都会遇到的相同问题,然后继续:确保您真的想为此使用 Core Data,而不仅仅是直接使用 sqlite。 Core Data 用于持久化对象图,而不是通用数据库。如果您已经为 Android 实现了数据库,那么您可能希望在 iOS 上使用相同的架构和设计。

好的,解决这个问题。让我们假设 CD 确实是完成这项工作的最佳工具(或者此时您无法更改它)。我的第一个想法是作弊。当然,这通常是我早期的想法之一......

看看在没有关系的情况下插入这些对象的速度有多快。如果这足够快,那么你就是这样作弊的:一开始不要存储实际的关系。存储描述关系的标识符的字符串列表。然后,一旦所有内容都加载完毕并且用户可以开始工作,随着时间的推移,将字符串关系转换为后台的真实关系。每当您获取记录时,您需要检查它是否仍然设置了作弊属性,如果是,则需要手动获取其关系(然后清除作弊属性)。

这并没有使完全导入更快,但它给人一种更快的错觉,这是 iOS 90% 时间的目标。您甚至可能不得不阻止某些操作(例如删除),直到您完成所有内容的粘合,但这可能仍然比完全阻止用户更好。

【讨论】:

  • 这就是我害怕的。我更喜欢将我的数据作为对象来处理,所以我希望有一种方法可以让 Core Data 成为正确的解决方案,但到目前为止,它还不是。
【解决方案3】:

我不关心您正在遵循的过程,但您是否考虑过使用块和 GCD(Grand Central Dispath)?我猜这是在 LinkedIn 的员工关于他们在 iTunesU 中的 iPhone 应用程序的演示中。如果我没记错的话,他们也在使用 GCD。

"...GCD API,它支持在系统的 Unix 级别异步执行操作。您可以使用此 API 来管理与文件描述符、Mach 端口、信号或计时器的交互..."

https://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html#//apple_ref/doc/uid/TP40008079

【讨论】:

  • 我认为从 NSOperations 切换到 GCD 可能只会给我几毫秒的性能提升(如果有的话),但是编码然后测试代码以切换到 GCD 的时间量在这方面是不合理的观点。我想我需要备份和平底船,撕掉核心数据。
  • 同意。 GCD 不会在这里改变任何东西。块更少。
猜你喜欢
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 2015-04-19
  • 2011-12-07
相关资源
最近更新 更多