【问题标题】:Core-Data: Import large datasetCore-Data:导入大型数据集
【发布时间】:2014-06-25 16:28:31
【问题描述】:

我面临需要将一个可能很大(20.000+)的数据集导入核心数据的情况。数据以 JSON 格式从 Web 服务中检索。至于导入,它是一种简单的更新或创建类型的东西,也代表了一个层次结构,因此对于每个实体,我都设置了一个父实体(当然顶级实体除外)。目前该进程运行速度太慢,可能占用大量内存。所以我必须优化,我对这样做的最佳实践有疑问。

首先,我使用一个单独的线程和一个子 NSManagedObjectContext 来导入,这样我的 UI 线程就不会卡住。基本原理是有效的。

首先我想批量处理数据。可能最好的解决方案是只解析对象的一部分 JSON 答案,然后处理它们。然后我将实现https://developer.apple.com/library/mac/DOCUMENTATION/Cocoa/Conceptual/CoreData/Articles/cdImporting.html 中描述的查找或创建效率。

我的问题是:

  • 合适的批量大小是多少? 1000?

  • 由于我需要为每个实体查找并设置父实体,我的方法是在没有父实体的情况下处理批处理后的第二次迭代中执行此操作。这样我也可以为父母做批量提取。这是个好主意/有没有更好的方法?

  • 每批之后,我都会重置子 MOC 并保存在父 MOC 中。这够了吗?我还需要做更多吗?

    [self.childmoc reset];
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        [self.moc save];
    });
    
  • 目前我通过能够自动解析 JSON 的 AFNetworking 加载数据。在重构时,将收到的答案拆分为单独的文件(每个文件一批)而不破坏 json 对象的最佳方法是什么? AFNetworking 使用什么 JSON 解析器 (AFJSONResponseSerializer)?我也可以在加载文件时使用它吗?

  • 我需要特别注意哪些陷阱?

感谢您的帮助!

【问题讨论】:

  • 关于最佳批量大小,您最好尝试一下。测试几个,看看哪一个效果最快

标签: ios objective-c core-data import


【解决方案1】:

这只是我的两分钱,但您的问题不在于将数据导入 Core Data,而是将其导入 Core Data 正在抽象的数据存储中。

考虑到这一点,您可能有其他选择,具体取决于您的特定用例(例如,如果您的数据是在首次启动时导入的),例如:

  • 不使用 Core Data 进行导入,而是直接使用 sqlite。然后在完成后(重新)初始化 Core Data 堆栈
  • 如果您控制服务并且它不是公共 API,则可以添加一个端点,让您可以直接在种子 .sqlite 文件中进行流式传输。尽管如果您需要进行创建或更新,这可能不是最好的主意。同样,这取决于您的用例。

只是一个想法......

【讨论】:

  • 感谢您的意见。不幸的是,它不仅是首次发布的东西。此外,我将不得不直接在 SQL 中处理核心数据内部结构,如关系等,我想避免这种情况。
猜你喜欢
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多