减小 Realm 文件大小 - .NET SDK
Overview
随着时间的推移,Realm 使用的存储空间可能会变得碎片化,并占用超过必要的空间。 要重新排列内部存储并尽可能减小文件大小,需要压缩 Realm 文件。
Realm 的默认行为是自动压缩 Realm 文件以防止其变得太大。 当自动压缩不足以满足您的使用案例时,您可以使用手动压缩策略。
自动压缩
版本 10.20.0 中的新增功能。
SDK 通过不断重新分配文件内的数据并删除未使用的文件空间,在后台自动压缩 Realm 文件。对于大多数应用程序来说,自动压缩足以最大限度地减小 Realm 文件。
当文件中未使用空间的大小超过文件中用户数据大小的两倍时,即会开始执行自动压缩。仅当文件未被访问时才会执行自动压缩操作。
手动压缩选项
手动压缩可用于需要更严格管理文件大小的应用程序,或使用不支持自动压缩旧版本 SDK 的应用程序。
Realm 通过写入文件的新(压缩)版本,然后用新写入的文件替换原始文件来减小文件大小。 因此,要进行压缩,必须具有与原始 Realm 文件大小相当的可用存储空间。
您可以将 Realm 配置为在每次打开 Realm 时自动压缩数据库,也可以在不首先获取 Realm 实例的情况下压缩文件。
Realm 配置文件
您可以通过在配置中指定 ShouldCompactDelegate将 Realm 配置为在每次打开Realm文件时检查该域文件。 以下代码示例展示了如何执行此操作:
config = new RealmConfiguration() { ShouldCompactOnLaunch = (totalBytes, usedBytes) => { /* totalBytes refers to the size of the file on disk in * bytes (data + free space). * usedBytes refers to the number of bytes used by * the realm file */ // Compact if the file is over 100MB in size and less // than 50% 'used' var oneHundredMB = 100 * 1024 * 1024; return (totalBytes > (double)oneHundredMB) && ((double)usedBytes / totalBytes < 0.5); } }; var realm = await Realm.GetInstanceAsync(config);
如果委托返回 true
,并且该文件未在使用中,则在使实例可用之前会压缩 Realm 文件。
Realm.Compact() 方法
或者,您可以通过调用Compact()方法压缩域文件,而无需先获取域实例。 以下示例展示了如何执行此操作:
config = new RealmConfiguration("my.realm"); Realm.Compact(config);
如果操作成功, Compact
方法将返回 true。
手动压缩 Realm 的技巧
手动压缩 Realm 可能是一项资源密集型操作。 应用程序不应在每次打开 Realm 时都进行压缩。 相反,应尝试优化压缩操作,以便应用程序经常执行压缩操作,防止文件过大。 如果应用程序在资源有限的环境中运行,则可能需要在文件大小达到一定大小或文件大小对性能产生负面影响时进行压缩。
这些建议可以帮助您开始优化应用程序的压实:
将最大文件大小设置为平均 Realm 状态大小的倍数。如果平均 Realm 状态大小为 10MB,您可以将最大文件大小设置为 20MB 或 40MB,具体取决于预期的使用情况和设备限制。
首先,超过 50% 的 Realm 文件大小不再使用时,即可压缩 Realm。将当前已使用的字节数除以总文件大小,确定当前使用的空间百分比。然后,检查该值是否小于 50%。也就是说,超过 50% 的 Realm 文件大小是未使用的空间。这正是压缩的好时机。经过试验后,您可能会发现最适合您的应用程序的百分比并不相同。
这些计算在您的委托中可能如下所示:
// Set a maxFileSize equal to 20MB in bytes var maxFileSize = 20 * 1024 * 1024; /* Check for the realm file size to be greater than the max file size, * or the amount of bytes currently used to be less than 50% of the * total realm file size */ return (totalBytes > (double)maxFileSize) && ((double)usedBytes / totalBytes < 0.5);
测试各种条件,确定在应用程序中压缩 Realm 文件的频率,以实现平衡。