【问题标题】:Core Data. Fastest way to fill 2 double linked entities?核心数据。填充2个双链接实体的最快方法?
【发布时间】:2013-09-27 22:18:13
【问题描述】:

我有 2 个表(和类似的实体):

  1. 类别(具有字符串属性标识符)

  2. CategoryLink(具有属性 category1 和 category2,它们是 Category 对象的指针)

我有一个文本文件,其中包含有关类别及其链接的信息。有关链接的信息表示为一对第一个和第二个链接 ID。

我想使用 Core Data 填充我的数据库。我填写 Category 的速度足够快,但 CategoryLink 的性能存在问题。

我最好的实现是:

  1. 获取按标识符排序的所有类别;

  2. 从文件中获取整个链接信息到字典数组,按第一项 id 排序;

  3. (1) 中的每个类别的每个类别的循环

  4. 在循环 (3) 中,我在迭代中使用 (2) 中的 ID 搜索第二个类别,并创建 CategoryLink 实体的对象。

性能太慢,因为要插入大量的Category 和CategoryLinks 记录。那么有没有办法提高性能呢?

【问题讨论】:

  • 哪个部分需要很长时间?另外,是否有重复(如 AB 和 BA)?
  • Category 和 CategoryLink 记录都是唯一的。很难说哪个部分花费的时间最多,因为代码在一个块内。但我认为最长的任务是搜索第二个类别至少与 CategoryLink 实体对象的计数一样多
  • 你也可以在一个区块内计时。在两边都做一个NSTimeInterval x = [[NSDate date] timeIntervalSince1970]; 并记录差异。
  • 好的。我检查了一下,即使没有 (4) 中的其他操作,它仍在搜索第二个类别。但它看起来足够快(约 0.036 秒)。附言你不需要使用特殊的计时器,除非你想执行一些特殊的计算,比如间隔。在大多数情况下,记录一些内容就足够了(它也会写入日志时间)。
  • 对于性能问题,请在 Instruments 下运行应用程序。您会更清楚地了解您的应用确切在哪里花费时间。

标签: ios core-data entity


【解决方案1】:

假设您在内存中进行所有查找,最重要的性能因素是您保存上下文的频率。

不要在循环的每次迭代中保存。尝试分批保存。理想的数字取决于数据,但通常在 500-2000 左右。

对于初学者,请尝试仅在最后保存,看看需要多长时间。

我会遍历您排序的字典列表,并始终保留对 catgory1 的引用。

【讨论】:

  • 你能多说一点吗。我有 2 个线程,而 db 正在填充。第一个线程是主线程,第二个线程是由我创建的,用于与屏幕绘图/更新分开填充数据库。如您所见,之前描述的代码不包含 [context save:...]。该应用程序仅在实体对象的创建和填充方面太慢了。
猜你喜欢
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多