【问题标题】:PouchDB compaction has no affect on db size on diskPouchDB 压缩对磁盘上的数据库大小没有影响
【发布时间】:2015-10-29 22:07:16
【问题描述】:

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

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

然而,我的测试表明手动压缩数据库对使用的磁盘空间没有影响。在我的测试中,我使用 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 的磁盘大小将保持与上述示例中的大小相同。

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

提前感谢您的帮助,

安德鲁。

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

【问题讨论】:

    标签: pouchdb compact-database


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-25
        • 2014-05-24
        • 2015-04-11
        • 2021-06-01
        • 2020-04-25
        • 2012-11-09
        相关资源
        最近更新 更多