领域文件太大

时间:2016-03-08 11:07:18

标签: swift2 realm

我正在尝试将Realm集成到我的项目中,并发现了一个问题。我已经看到了其他帖子,但是它们在一年多前就已经解决了。

向Realm添加对象时,事情就是文件。但是当删除对象时,它们会从数据库中删除,但文件大小仍然很大。如果我在TextEdit中打开realm文件,我可以看到旧记录的原始文本。为什么他们没有完全删除?

看一下这个截图。 Realm DB中的文件为零,但文件大小为23 MB。

感谢。

enter image description here

4 个答案:

答案 0 :(得分:1)

作为bcamur伤心,

  

Realm文件将在磁盘上保持其大小以便有效地重用   未来对象的空间

但也有写

  

额外的空间最终将被未来的写入重用,或者可能是   压缩 - 例如通过调用   Realm().writeCopyToPath(_:encryptionKey:)

  

致电invalidate告诉Realm你不再需要任何一个   到目前为止,您从Realm中读取的对象可以让我们摆脱困境   跟踪这些对象的中间版本。领域将更新   下次访问时的最新版本

答案 1 :(得分:1)

我还意识到我的Realm文件大小太大(并且从未减小),而对我来说,解决方案是通过以下方式初始化Realm数据库:

class RealmManager {

    static let shared = RealmManager()

    private var realm: Realm?

    private init() {
        let config = Realm.Configuration(schemaVersion: 1, shouldCompactOnLaunch: { totalBytes, usedBytes in
            // totalBytes refers to the size of the file on disk in bytes (data + free space)
            // usedBytes refers to the number of bytes used by data in the file

            // Compact if the file is over 100MB in size and less than 50% 'used'
            let oneHundredMB = 100 * 1024 * 1024
            return (totalBytes > oneHundredMB) && (Double(usedBytes) / Double(totalBytes)) < 0.5
        })
        do {
            // Realm is compacted on the first open if the configuration block conditions were met.
            realm = try Realm(configuration: config)
        } catch let error {
            // handle error compacting or opening Realm
            print(error)
        }
    }
}

关键是在我的配置中添加shouldCompactOnLaunch块,请注意,只有在有另一个进程访问领域数据库(例如:在Realm Studio中打开的数据库)之后,压缩操作才会完成。

有关更多信息,您可以检查以下链接: https://realm.io/docs/swift/latest/#compacting-realms

答案 2 :(得分:0)

Realm坚持使用该空间以便以后用于新对象:

  

您还可以删除存储在Realm中的所有对象。请注意,Realm文件将在磁盘上保持其大小,以便有效地将该空间重用于将来的对象。

请参阅this part of documentation

答案 3 :(得分:0)

Swift版本3.0.1

紧凑型数据库:

func compactRealm() {
    let defaultURL = Realm.Configuration.defaultConfiguration.fileURL!
    let defaultParentURL = defaultURL.deletingLastPathComponent()
    let compactedURL = defaultParentURL.appendingPathComponent("default-compact.realm")

    autoreleasepool {
        let realm = try! Realm()
        try! realm.writeCopy(toFile: compactedURL)
        try! FileManager.default.removeItem(at: defaultURL)
        try! FileManager.default.moveItem(at: compactedURL, to: defaultURL)
    }
}