【问题标题】:Pouch DB : database sizePouch DB:数据库大小
【发布时间】:2014-07-06 14:54:56
【问题描述】:

我将 ~2500 张图像作为附件存储在 CouchDB 的同一文档中。这些图像大约占用 15MB 的硬盘空间,生成的 CouchDB 大约为 17MB。

当我通过 PouchDB 将此文档推送到我的客户端时,我看到生成的数据库超过 40 MB。我按照以下步骤进行了一些测试:

  1. 将 X 图像附件上传到 CouchDB 文档。

  2. Compact CouchDB

  3. 完全清除客户端缓存

  4. 重新加载客户端(在我的应用中,我在重新加载时复制数据)。

这是结果:

number of attached files | Total size (KB) in HD | Inc | Size in Indexed DB | Inc
17                         129                           207
27                         168.2                   39.2  267                  60
37                         219.6                   51.4  335                  68
47                         275.5                   55.9  414                  79
57                         327.7                   52.2  493                  79
67                         384.9                   57.2  579                  86
77                         428.5                   43.6  654                  75

所以,看来:

  1. PouchDB 向每个附件添加大约 2K 控制数据。

  2. 当添加更多附件时,此控制数据会增加。 (1.6K -> 2.3K -> 2.6K -> 2.8K...)

图像在 CouchDB 和 PouchDB 中都有 content_type:image/png。我知道这应该防止将它们存储为base64。我说的对吗?

以前有人看过吗?有没有人能够解决它? 如果要在 iOS 50MB 空间限制内安装应用程序,这是一个大问题。

编辑

我继续检查了 pouchDB 中一些图像与原始文件的大小:

  1. 文件 1:原始大小 = 7.4K / PouchDB 大小 = 10.2K

  2. 文件 2:原始大小 = 5.1K / PouchDB 大小 = 6.8K

所以我认为在 PouchDB 中存储附件时大小的增加不是来自任何控制数据(至少它不相关),而是来自二进制文件在浏览器 IndexedDB 中的存储方式(我使用 Chrome 进行这些计算)。

那么,为了避免 PouchDB 中二进制大小的增加,是否需要做任何额外的事情?

【问题讨论】:

    标签: couchdb pouchdb


    【解决方案1】:

    一个很好的问题,但答案取决于您使用的适配器,从描述中不清楚。

    编辑:刚刚意识到您确实说过 Chrome,但我为后代保留了原始答案:)

    • 在 Node.js 中,我们通过 LevelUP 使用 LevelDB,它将二进制数据直接存储在磁盘上。
    • 在 Safari/iOS 中,我们使用 WebSQL,它存储二进制 blob,因此再次没有开销。
    • 在其他所有内容中,我们都使用 IndexedDB,它在除 Chrome 之外的所有内容中接受 API 级别的 Blob 对象,因为 Chrome 尚不支持 (issue)。

    我猜你是在 Chrome 中进行测试。因此,您看到性能不佳的原因是我们必须将所有内容存储在 base64 中作为一种解决方法 (source)。

    从好的方面来说,这个 Chromium 错误非常活跃(最后评论是 48 小时前),所以大概 Chrome 团队正在处理它,并将很快发布修复程序。当他们这样做时,PouchDB 将自动检测到 blob 支持可用并开始使用它。

    更新:Chrome 团队修复了这个问题,并且从 Chrome v43 开始,PouchDB 支持 Blob。 :)

    【讨论】:

    • 我主要使用 Chrome 进行测试(良好的工具)。但也尝试使用 iOS Safari。在那里我看到了同样的问题,在加载整个数据库时,iOS 中专门用于 Web 应用程序的空间约为 43MB 而不是 20MB 左右。所以至少这个问题是关于 IndexedDB 和 WebSQL 的。
    • 您是否压缩了您的客户端数据库?如果在初始复制之前完成,服务器上的压缩只会影响客户端。
    • 您可以在 Chrome 中尝试的另一件事是使用 new PouchDB('dbname', {adapter: 'websql'}) 这样您就可以看到 sqlite 数据库的样子。 Chrome 支持 IndexedDB 和 WebSQL。
    • 啊,我突然想到,在 iOS 中,大小可能几乎翻了一番(43MB 对 20MB),因为 iOS/Safari 将二进制数据强制转换为 UTF-16。因此,对于 PNG 数据,您将有效地为每个字节获得一个额外的 \u0000 字节。我不确定,但SQLite plugin 的行为可能有所不同,因此您可能想尝试一下。
    • 使用 websql 修复了 Chrome 中的问题。
    猜你喜欢
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2023-01-01
    • 1970-01-01
    相关资源
    最近更新 更多