我目前正在使用Swift中的iOS项目,我使用Realm作为我的数据库。 我存储一个Realm对象,其中一个属性是NSData对象(实际上它是我转换为NSData的UIImage)。
我的问题很容易理解:当我存储一个大小为3 Mo的NSData对象时,我的Realm文件大小约为15 Mo.但是当我的NSData对象大小为6 Mo时,我的Realm文件大小变为大约80莫。
有没有人遇到过这个问题? 这种差异有什么理由吗? 有没有办法解决这个问题?
答案 0 :(得分:3)
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:
方法。复制的文件将被压缩。