2014-05-08 40 views
1

我面临的情况是,我需要将一个可能很大(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)?我也可以在加载文件时使用它吗?

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

感谢您的帮助!

+0

关于最优批量大小,你最好的选择它来尝试一下,看看。测试几个,看看哪一个工作最快 – dandan78

回答

1

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

考虑到这一点,你可能有其他的选择根据您具体的使用情况下(即如果你的数据导入在例如首次发射),如:

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

只是一个想法...

+0

感谢您的想法。不幸的是,它不仅是首次发布的类型。此外,我将不得不直接与SQL中的关系等内核数据内核混淆,我想避免这种情况。 – patman