【问题标题】:Excessive difference in realm file size when storing different NSData存储不同 NSData 时领域文件大小差异过大
【发布时间】:2023-03-15 06:57:01
【问题描述】:

我目前正在使用 Swift 开发一个 iOS 项目,并且我使用 Realm 作为我的数据库。 我正在存储一个 Realm 对象,其属性之一是 NSData 对象(实际上它是我转换为 NSData 的 UIImage)。

我的问题很容易理解:当我存储一个大小为 3 Mo 的 NSData 对象时,我的 Realm 文件大小约为 15 Mo。但是当我的 NSData 对象大小为 6 Mo 时,我的 Realm 文件大小变为大约 80莫。

有人遇到过这个问题吗? 这种差异有什么原因吗? 有什么办法可以解决吗?

【问题讨论】:

    标签: ios iphone swift realm


    【解决方案1】:

    由于某些原因,Realm 文件大小不等于存储的数据大小。

    一个是数据的内部版本。

    如果您的 Realm 文件比您预期的要大得多,可能是因为您的 RLMRealm 引用了数据库中旧版本的数据。

    为了给您提供一致的数据视图,Realm 仅更新在运行循环迭代开始时访问的活动版本。这意味着如果您从 Realm 读取一些数据,然后在长时间运行的操作中阻塞线程,同时在其他线程上写入 Realm,则版本永远不会更新,并且 Realm 必须保留您的数据的中间版本可能实际上不需要,导致文件大小随着每次写入而增长。额外的空间最终将被未来的写入重用,或者可能被压缩——例如通过调用 writeCopyToPath:error: 。

    https://realm.io/docs/objc/latest/#file-size--tracking-of-intermediate-versions

    还有,

    在移动平台上,Realm 文件大小从 4KB 开始,并且每次需要超过当前分配的大小时都会增加一倍。这种翻倍在 32MB 处停止,此时文件以 16MB 的增量增长。所以 16MB -> 32MB -> 48MB。

    https://github.com/realm/realm-cocoa/issues/2631#issuecomment-145566190

    这就是文件大小比您预期的要大的原因。

    要优化(删除所有可用空间)Realm 文件大小,可以使用writeCopyToPath:error: 方法。复制的文件将被压缩。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      相关资源
      最近更新 更多