减小 Realm 文件大小 — C++ SDK
随着时间的推移,Realm 使用的存储空间可能会变得碎片化,并占用超过必要的空间。 要重新排列内部存储并尽可能减小文件大小,需要压缩 Realm 文件。
Realm 的默认行为是自动压缩 Realm 文件以防止其变得太大。 当自动压缩不足以满足您的使用案例时,您可以使用手动压缩策略。
自动压缩
SDK 通过不断重新分配文件内的数据并删除未使用的文件空间,在后台自动压缩 Realm 文件。对于大多数应用程序来说,自动压缩足以最大限度地减小 Realm 文件。
当文件中未使用空间的大小超过文件中用户数据大小的两倍时,即会开始执行自动压缩。仅当文件未被访问时才会执行自动压缩操作。
手动压缩选项
手动压实可用于需要更严格管理文件大小的应用程序。
Realm 手动压缩的工作原理是:
读取 Realm 文件的全部内容
将内容写入不同位置的新文件
替换原始文件
如果文件包含大量数据,它可能是一项成本高昂的操作。
对数据库配置使用 should_compact_on_launch()方法尝试压缩数据库。 指定执行此方法的条件,例如:
磁盘上文件的大小
文件包含多少可用空间
以下示例显示了如果文件大于 100 MB 并且 Realm 文件中已使用空间的 50% 或更少,则设置条件以压缩 Realm。
// Create a database configuration. auto config = realm::db_config(); config.should_compact_on_launch([&](uint64_t totalBytes, uint64_t 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' auto oneHundredMB = 100 * 1024 * 1024; return (totalBytes > oneHundredMB) && (usedBytes / totalBytes) < 0.5; }); // The database is compacted on the first open if the configuration block // conditions were met. auto realm = realm::db(config);
手动压缩 Realm 的技巧
手动压缩 Realm 可能是一项资源密集型操作。 应用程序不应在每次打开 Realm 时都进行压缩。 相反,应尝试优化压缩操作,以便应用程序经常执行压缩操作,防止文件过大。 如果应用程序在资源有限的环境中运行,则可能需要在文件大小达到一定大小或文件大小对性能产生负面影响时进行压缩。
这些建议可以帮助您开始优化应用程序的压实:
将最大文件大小设置为平均 Realm 状态大小的倍数。如果平均 Realm 状态大小为 10MB,您可以将最大文件大小设置为 20MB 或 40MB,具体取决于预期的使用情况和设备限制。
首先,超过 50% 的 Realm 文件大小不再使用时,即可压缩 Realm。将当前已使用的字节数除以总文件大小,确定当前使用的空间百分比。然后,检查该值是否小于 50%。也就是说,超过 50% 的 Realm 文件大小是未使用的空间。这正是压缩的好时机。经过试验后,您可能会发现最适合您的应用程序的百分比并不相同。