保存时的核心数据性能问题
Posted
技术标签:
【中文标题】保存时的核心数据性能问题【英文标题】:Core Data Performance issue while Saving 【发布时间】:2015-07-30 11:11:14 【问题描述】:我正在使用 NSSqliteStoreType 的核心数据将数据存储在我的 ios 应用程序中。 我需要将大量对象存储到数据库中。 为了提高核心数据的性能,我考虑了很多因素,例如:
-
批量保存
仅在 for 循环结束后保存
清除上下文以管理内存
但是保存 100k 个对象需要花费大量时间。请建议我在保存大量数据的同时提高核心数据性能的最佳做法。
【问题讨论】:
【参考方案1】:-
您应该在非 UI 线程上使用直接绑定到持久存储协调器的上下文而不是主上下文的子上下文进行导入
您应该在每插入数百个新对象时调用一次
[managedObjectContext save]
,具体取决于对象大小和图形复杂性。详情请见this answer
您应该将步骤 2 中的批处理包装在 @autoreleasepool
块中,并在保存后在退出自动释放块之前重置上下文。见this answer
【讨论】:
把它作为一个孩子而不是一个单独的上下文并不是一个重大的性能变化。使用子上下文的代码更少,导致性能问题的机会也更少。这通常是更安全的路线。 @MarcusS.Zarra 哦,是的。当您执行save
(在主线程上进行调用)并在那里传输数据时,使其成为子上下文会阻塞主线程。这意味着要真正将数据刷新到磁盘,您必须在主上下文上调用save
,它将在主线程上运行。然后重置它将意味着您的应用程序数据将从内存中卸载......简而言之,它确实有所作为。而且它也不是更多的代码,只需将协调器设置为上下文即可。【参考方案2】:
您应该考虑在发布应用时预先填充数据,以避免大部分导入开销。假设数据足够静态(大多数数据是),您可以将所有数据预加载到发送应用程序的时间点,然后当应用程序启动时,它只需要从发货日期向前(或上次刷新日期)获取数据向前)。
正如 Leonid Usov 所说,您还应该在后台上下文中进行导入并批量保存到磁盘。这将有助于降低内存并提高 UI 性能。但是在数据的最后,大量数据的导入是密集型的,应该尽量通过预加载来避免。
【讨论】:
以上是关于保存时的核心数据性能问题的主要内容,如果未能解决你的问题,请参考以下文章
Matplotlib,savefig() 的替代品以提高保存到 CString 对象时的性能?