我正在将数据导入 Core Data 并发现保存操作很慢。使用 iOS 模拟器,我观察 sqlite-wal 文件不断增长,直到其大小超过 7GB。
我正在导入大约 5000 条记录,其中包含大约 10 个字段。这并不是很多数据。
我插入的每个对象都与其他各种对象具有一对一关系(总共 6 个关系)。所有这些记录加起来不到 20 个字段。没有图像或任何二进制数据或任何我能看到的东西可以证明为什么 WAL 文件的结果大小如此之大。
我阅读了描述 wal 文件的 sqlite 文档,但我不明白这是如何发生的。源数据不超过 50 MB。
我的应用程序是多线程的。
我在执行导入的后台线程中创建一个托管对象上下文(创建并保存核心数据对象)。
代码没有写出来,有没有人遇到过这种情况?任何人都知道我应该检查什么。代码并不是非常简单,所有部分都需要时间在这里输入,所以让我们从一般想法开始。
我会赞扬任何让我朝着正确方向前进的人。
额外信息:
- 我已经禁用了上下文的撤消管理器,因为我不需要它(我认为它在 iOS 上默认为 nil,但我明确将其设置为 nil)。
- 我仅在整个循环完成并且所有托管对象都在 RAM 中(RAM 达到 100 MB 顺便说一句)后才调用 save。
- 核心数据对象的循环和创建只需要5秒左右。保存过程大约需要 3 分钟,因为它会写入 awl 文件。
我的评论似乎是尝试使用旧的回滚(删除)日志模式而不是 WAL 日志模式解决了问题。请注意,使用 WAL 日志模式时似乎存在一系列问题,包括以下内容:
- 这个问题
- 使用 migratePersistentStore API 时出现数据库迁移问题
- 轻量级迁移的问题
也许我们应该启动一个 Core Data WAL 问题页面并获取全面的列表并要求 Apple 修复错误。
请注意,OS X 10.9 和 iOS 7 下的默认模式现在使用 WAL 模式。要将其更改回来,请添加以下选项
@{ NSSQLitePragmaOptions : @{ @"journal_mode" : @"DELETE" } }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)