插入~5000行时,Core Data sqlite-wal文件获得MASSIVE(> 7GB)

时间:2013-11-26 21:38:11

标签: ios iphone sqlite core-data import

我正在将数据导入Core Data并发现保存操作很慢。使用iOS模拟器,我看到sqlite-wal文件增长并增长,直到它的大小超过7GB。

我正在导入大约5000个记录,包含大约10个字段。这不是很多数据。

我插入的每个对象与各种其他对象(总共6个关系)具有一对一的关系。所有这些记录合计不到20个字段。没有任何图像或任何二进制数据或任何我能看到的东西可以证明为什么WAL文件的结果大小如此之大。

我阅读了描述wal文件的sqlite文档,但我看不出这是怎么回事。源数据不超过50 MB。

我的应用是多线程的。 我在后台线程中创建一个托管对象上下文,执行导入(创建并保存核心数据对象)。

如果没有在这里编写代码,有没有人遇到过这个?任何人都想过我应该检查什么。代码不是非常简单,所有部分都需要时间在这里输入,所以让我们从一般的想法开始。

我会相信任何能让我朝着正确方向前进的人。

额外信息:

  • 我已经禁用了上下文的撤消管理器,因为我不需要它(我认为默认情况下它在iOS上是零,但我明确地将其设置为nil)。
  • 我只在整个循环完成后调用save并且所有托管对象都在ram中(ram最高可达100 MB btw)。
  • 核心数据对象的循环和创建只需5秒左右。写入awl文件时保存大约需要3分钟。

2 个答案:

答案 0 :(得分:9)

似乎我的评论尝试使用旧的回滚(DELETE)日志模式而不是WAL日志模式修复了问题。请注意,使用WAL日志模式时似乎存在一系列问题,包括:

  • 这个问题
  • 使用migratePersistentStore API时数据库迁移的问题
  • 轻量级迁移的问题

也许我们应该启动Core Data WAL问题页面并获得一个全面的列表,并要求Apple修复错误。

请注意,OS X 10.9和iOS 7下的默认模式现在使用WAL模式。要更改此选项,请添加以下选项

@{ NSSQLitePragmaOptions : @{ @"journal_mode" : @"DELETE" } }

答案 1 :(得分:0)

事务的所有已更改页面都会附加到-wal文件。 如果要导入多个记录,则应if possible使用单个事务进行整个导入。

当一些其他连接正在读取数据库时,SQLite无法执行完整的WAL checkpoint(这可能只是您忘记关闭的一些声明)。