数据:导入大型数据集

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

首先我使用一个单独的线程与一个子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加载数据,它能够自动进行JSON解析。 何时重构什么是将接收到的答案拆分为单独文件(每批一个)而不破坏json对象的最佳方式? AFNetworking使用什么JSON解析器(AFJSONResponseSerializer)? 我也可以在加载文件时使用它吗?

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

  • 感谢您的帮助!


    这仅仅是我的两分钱,但你的问题并不是将数据导入到Core Data中,而是将它导入到Core Data抽象的数据存储中。

    考虑到这一点,根据您的具体使用情况(例如,如果您的数据是在第一次启动时导入的),您可能有其他选择,例如:

  • 不使用核心数据进行导入,而是直接使用sqlite。 然后(重新)初始化核心数据堆栈
  • 如果您控制该服务并且它不是一个公共API,那么可以添加一个终点,让您直接在种子.sqlite文件中进行流式传输。 尽管如果您需要创建或更新,这可能不是最好的想法。 再次,这取决于你的用例。
  • 只是一个想法...

    链接地址: http://www.djcxy.com/p/47385.html

    上一篇: Data: Import large dataset

    下一篇: @import vs #import