我面临这样一种情况,我需要将一个可能很大 (20.000+) 的数据集导入到核心数据中。数据以 JSON 格式从 Web 服务中检索。至于导入,它是一种简单的更新或创建的东西,也代表了一个层次结构,所以对于每个实体我都设置了一个父实体(当然顶级实体除外)。目前该进程运行速度太慢,可能占用了太多内存。所以我必须进行优化,并且我对这样做的最佳实践有疑问。
首先,我使用一个带有子 NSManagedObjectContext
的单独线程进行导入,这样我的 UI 线程就不会卡住。基本原理是有效的。
首先我想批量处理数据。可能最好的解决方案是只解析对象的一部分 JSON 答案,然后处理它们。然后我将实现 https://developer.apple.com/library/mac/DOCUMENTATION/Cocoa/Conceptual/CoreData/Articles/cdImporting.html 中描述的查找或创建效率.
我的问题是:
好的批量大小是多少? 1000?
由于我需要为每个实体查找并设置一个父实体,我的方法是在没有父实体的情况下处理该批处理后,在第二次迭代中执行此操作。这样我也可以为 parent 进行批量提取。这是个好主意/有更好的方法吗?
在每批处理之后,我都会重置子 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 抽象的数据存储。
考虑到这一点,您可能有其他选择,具体取决于您的特定用例(例如,如果您的数据是在首次启动时导入的),例如:
- 不使用 Core Data 进行导入,而是直接使用 sqlite。然后在完成后(重新)初始化核心数据堆栈
- 如果您控制该服务并且它不是一个公共(public) API,则可能会添加一个端点,让您可以直接在种子 .sqlite 文件中进行流式传输。尽管如果您需要进行创建或更新,那可能不是最好的主意。同样,这取决于您的用例。
只是一个想法...
关于ios - 核心数据:导入大型数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23539079/