如何利用ios中的核心数据提高大数据导入性能

时间:2012-01-10 14:30:47

标签: ios sqlite core-data

首次启动iOS应用时,我正在从Web服务导入约18,000条各种实体的记录。记录在Web上的数据库中有自己唯一的标识符。我阅读并重新阅读了苹果的文档,cimgf的博客文章,Marcus Zarra关于核心数据的书籍,并一遍又一遍地观看iDeveloper TV关于核心数据的系列文章。我无法想出一种方法来导入实体A而不将实体B,C和D保留在内存中或执行昂贵的提取并维护实体之间的关系。如果我没有使用核心数据,我将能够使用已经建立的唯一标识符,导入速度会快得多。

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

我们已在Android中实施此策略,导入需要约2.5分钟,相比之下,iOS上约6分钟,不同设备上的硬件具有可比性。缩短导入时间对我们的用户至关重要,因此我无法在此问题上妥协。在此先感谢您的帮助。

修改

以下是我目前正在做的事情 - 我创建了一个NSOperation来创建它自己的上下文。我导入实体B,C和& D首先保留每个实体类型的数组。然后我导入实体A并使用谓词来过滤实体B,C和&的数组。 D,以便将实体A与B,C和B中的适当实体联系起来。 D.我是以优化的时间间隔批量保存上下文,这取决于我当前正在导入的实体类型。

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

3 个答案:

答案 0 :(得分:9)

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

好的,把它弄清楚了。让我们假设CD确实是这里工作的最佳工具(或者你现在无法改变它)。我在这里首先想到的是作弊。当然,这通常是我早期的想法之一......

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

这并不能使完全导入更快,但它会让人觉得它更快,而且这是iOS中90%的目标。你可能甚至必须阻止某些操作(比如删除),直到你完成粘合所有内容,但这可能仍然比完全阻止用户更好。

答案 1 :(得分:5)

听起来你正经历着这个家伙经历的同样的痛苦,他最终扯掉了Core Data。一定有更好的方法! http://inessential.com/2010/02/26/on_switching_away_from_core_data

答案 2 :(得分:0)

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

  

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

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