核心数据性能问题

时间:2017-01-19 20:02:58

标签: swift performance core-data macos-sierra

我的核心数据模型包含三个实体(没有继承)。

Management
Team Leader
worker

实体之间的关系: 对于任何经理,可以是更多的经理,团队领导和工人。 对于任何团队经理都可以是其他工人。

该模型总共包含100,000多个对象。

所有数据均由NSOutlineView表示,例如:

*Management
 -Management
   -Management
     -Team Leader
       -worker
       -worker
       -worker
   -Management
       -worker
       -worker
   -Management
   -worker
   -worker
   -worker
*Management
     -Team Leader
       -worker
       -worker
     -Team Leader
*Management
     -Team Leader
       -worker
       -worker

用户可以通过在文本字段中键入文本(标记)来过滤大纲视图。

对于每组令牌,我在核心数据模型中搜索实体或任何关系实体是否包含所有令牌,如果答案为真,则实体将在大纲视图中表示,以及他的所有祖先,例如如果只有两个工人包含所有令牌,则用户将看到(对于这两个工作,最近的共同祖先是第三个经理,而第一个工人也有团队负责人):

Management
 -Management
   -Management
     -Team Leader
       -<worker>
     -<worker>

所以,基本上我的数据结构是一棵树,搜索最直观的方式(对我来说)是递归算法(我用DFS完成)。

(如果我理解正确,则无法使用NSPredicate以递归方式进行搜索。)

因此,对于每组令牌(我使用限制以避免冗余  在用户输入时搜索)。我通过高层管理人员(最高层管理人员)和所有他们的关系实体(子管理层,团队成员和工人)。

此搜索操作需要很长时间。 恕我直言,主要的问题是我一直通过所有实体,我无法通过索引提高性能,因为我不使用查询,我只是浏览每个所有对象并将它们加载到内存中,我还会在内存中的对象之前,在早期查询中遇到性能问题。

有关如何提高性能的建议吗?

1 个答案:

答案 0 :(得分:0)

为什么要搜索递归?

我会这样做:

  • 只需使用NSPredicate在所有3个实体中搜索一次:
    • 你得到3个结果。
  • 从这三个结果构建您的结果树:
      每次点击的
    • 还将结果树中的breadcrumps添加到根