【问题标题】:Realm file size is too large领域文件太大
【发布时间】:2016-03-08 11:07:18
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

    标签: swift2 realm


    【解决方案1】:

    因为bcamur悲伤,

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

    但也有写

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

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

    【讨论】:

    • 所以补充一下.. 当数据库很大时,偶尔压缩它会是一个好习惯吗?看来我无法覆盖现有的领域,所以我需要创建一个新的,删除旧的,然后重命名。有点乏味...
    【解决方案2】:

    我还意识到我的 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

    【讨论】:

      【解决方案3】:

      Realm 保留该空间以供以后用于新对象:

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

      this part of documentation

      【讨论】:

        【解决方案4】:

        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)
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          • 1970-01-01
          • 2023-03-04
          相关资源
          最近更新 更多