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

Eri*_*ler 11 sqlite iphone import core-data ios

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

我正在导入大约10个字段的大约5000条记录.这不是很多数据.

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

我阅读了描述wal文件的sqlite文档,但我不知道这是怎么发生的.源数据不超过50 MB.

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

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

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

额外信息:

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

Dun*_*ald 9

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

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

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

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

@{ NSSQLitePragmaOptions : @{ @"journal_mode" : @"DELETE" } }
Run Code Online (Sandbox Code Playgroud)