核心数据:导入大型数据集

时间:2014-05-08 10:23:58

标签: ios objective-c core-data import

我面临的情况是我需要将一个可能很大(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];
    });
    
  • 目前我通过AFNetworking加载数据,AFNetworking能够自动进行JSON解析。重构什么是将收到的答案拆分成单独的文件(每个批处理)而不破坏json对象的最佳方法? AFNetworking使用什么JSON解析器(AFJSONResponseSerializer)?我也可以在加载文件时使用它吗?

  • 特别需要注意的任何陷阱?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

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

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

只是一个想法...