1

我使用 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。文件大小没有变化。

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

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

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

提前感谢您的帮助,

安德鲁。

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

4

2 回答 2

2

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

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

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

于 2017-12-22T10:11:55.443 回答
1

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

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

于 2015-08-07T15:33:08.733 回答