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