PouchDB 压缩对磁盘上的数据库大小没有影响

PouchDB compaction has no affect on db size on disk

我利用 couchdb/pouchdb 将数据从服务器复制到移动设备(数据仅复制到移动设备的下游)。

由于我的数据集很大(大约 100,000 个文档),我尝试使用 pouchdb 中的压缩功能来确保磁盘上的数据库大小保持较小并且不会增长到无法管理的大小。

然而,我的测试显示手动压缩数据库对使用的磁盘 space 没有影响。在我的测试中,我使用 Chrome 将 100,000 个文档从我的 couchdb 复制到一个 pouchdb。

查看“C:\Users[USERNAME]\AppData\Local\Google\Chrome\User Data\Default\databases[SERVER_URL]”目录,我相信Chrome也保存数据库,复制数据库后生成的文件大约71MB。

然后我通过简单地递增每个文档的值来更新 couchdb 中的 20,000 个文档。我随后将这些更改复制到 Chrome 中的 pouchdb。这导致数据库增长到 81MB。在此之后手动压缩数据库不影响 磁盘上 pouchdb 的大小。我已经执行了几次这一系列操作,但从未见过 Chrome 创建的 pouchdb 文件大小减小。

测试总结:

  1. 用 100,000 个文档填充 couchdb
  2. 使用 Chome 将 couchdb 复制到 pouchdb。结果为 71MB 数据库。
  3. 在 couchdb 中更新 20,000 个文档。复制到 pouchdb。结果为 81MB 数据库。
  4. 手动压缩 pouchdb。文件大小没有变化。
  5. 在 couchdb 中更新 20,000 个文档。复制到 pouchdb。结果为 83MB 数据库。
  6. 手动压缩 pouchdb。文件大小没有变化。
  7. 在 couchdb 中更新 20,000 个文档。复制到 pouchdb。结果为 84MB 数据库。
  8. 手动压缩 pouchdb。文件大小没有变化。

我创建了一个小示例应用程序来说明我的示例。您可以找到 files here(请阅读 readme.txt!)您可以使用它来重现我的测试。

我是不是误解了 pouchdb 中 compact 的作用?我假设通过删除文档的旧修订版(并且只保留叶节点),我的 pouchdb 的磁盘大小将在上面的示例中保持相对相同的大小。

还是我犯了一个愚蠢的编码错误? (对我来说并不罕见!)。

提前感谢您的帮助,

安德鲁。

更新 - 执行上述测试后,我决定使用 pouch 来检索我的一份文件。我发现 _revisions 是一个包含 4 个元素的数组。是我的数据库规模不断增长的原因,因为 pouchdb 跟踪文档的所有修订 ID?如果我压缩我的数据库,应该是这种情况吗?

您似乎正在使用 WebSQL 适配器。 SQLite 有一个奇怪的特性,即它不一定会清除其 space 用法,除非您执行显式 V​​ACUUM 命令。在我的脑海中,我不知道 VACUUM 在 WebSQL 中是否可用,但您可能想在压缩后尝试它,以便真正清理数据库的大小。

如果该修复有效,我们可能也有兴趣在压缩时将 VACUUM 命令添加到 PouchDB 本身,这样您就不必手动执行。 :)

@nolan,感谢您的指点。我在 pouchdb.cordova-sqlite.js 的 setup() 函数中添加了以下代码行,它是 sqllite 的 pouchDB 适配器。

tx.executeSql("PRAGMA auto_vacuum = FULL");

有效!它确实释放了磁盘 space(我在我们的 iOS 应用程序上检查过)。谢谢