核心数据当插入〜5000行时,sqlite-wal文件会获得MASSIVE(> 7GB)

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

我正在input大约10个字段的约5000条logging。 这不是很多数据。

我插入的每个对象与其他各种对象(总共6个关系)都有一对一的关系。 所有这些logging合计等于less于20个字段。 没有图像或任何二进制数据或任何我可以看到的将certificate为什么WAL文件的结果大小如此之大。

我读了描述沃尔玛文件的sqlite文档,我不明白这是怎么发生的。 源数据不超过50 MB。

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

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

我会赞扬任何让我朝着正确的方向前进的人。

额外信息:

  • 我已经禁用上下文的撤销pipe理器,因为我不需要(我认为这是iOS的默认为零,但我明确地将其设置为零)。
  • 我只在整个循环完成后调用save,并且所有的pipe理对象都是ram(ram上升到100 MB btw)。
  • 核心数据对象的循环和创build只需要5秒左右。 保存需要将近3分钟,因为它写入了awl文件。

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

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

也许我们应该启动一个核心数据WAL问题页面,并得到一个全面的列表,并要求苹果修复这些错误。

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

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

所有更改的事务页面都会附加到-wal文件中。 如果您要导入多个logging,则应尽可能使用单个事务处理整个导入。

SQLite不能做一个完整的WAL检查点,而其他一些连接正在读取数据库(这可能只是一些你忘记closures的语句)。