更改核心数据关系验证规则后保存缓慢



这是一个奇怪的问题。在我的数据模型上,我创建了一个新版本,只是将关系修改为可选(而不是非可选)

使用使用以前的模型版本创建的大型数据库运行更新的应用程序将导致第一次保存运行非常慢。这发生在每次应用程序启动后!

如果我使用更新的应用程序从头开始构建大型数据库(意味着使用新的模型版本),则不会有问题。

有什么想法吗?

更新 1:我没有提到一个重要的事实,即修改后的关系(从non-optional修改为optional)与持有大量二进制数据(blob)的图像实体相关联。

因此,添加-com.apple.CoreData.SQLDebug 1后,我想到了以下内容:

  • 在添加的模型版本之后,将进行轻量级迁移,以重新生成映像表并重新生成所有索引。
  • 在第一次保存时,会发生什么:
    1. BEGIN EXCLUSIVE
    2. 很少有UPDATE
    3. COMMIT(非常快!
    4. pragma page_count
    5. pragma freelist_count
    6. pragma incremental_vacuum(4055)(非常慢,将近 4 秒!

pragma incremental_vacuum在iPhone 4设备上需要近6秒,而在较慢的设备上则需要更多时间(超过10秒)。

请注意,在第一次保存时,无论您开发哪个应用程序,步骤 1-5 都将始终在应用程序加载后进行。

的情况的独特之处在于我得到了额外的incremental_vacuum。我可以看到为什么调用它(我猜是因为由于在轻量级迁移阶段重建大型图像表而有太多未使用的页面),但是,我不明白为什么稍后在后续应用程序加载时调用它。

第一次调用incremental_vacuum不应该解决未使用页面的问题并相应地更新 sqlite 文件吗?似乎incremental_vacuum的结果保存在内存中,而不是保存到文件中(尽管文件确实已保存)

首先,

将图像保存在核心数据中不是一个好的做法。相反,您可以尝试将图像保存在文档目录中,并在数据库中保留它们的路径。较大尺寸的图像将大大减慢保存操作。

在核心数据中保存需要时间的另一个原因是,如果我们在 for 循环中为您尝试保存的每个实体调用 managedObjectContext.save()。而是插入所有实体并调用 save() 一次。

最新更新