Couchdb 数据库大小

Couchdb 数据库大小,couchdb,pouchdb,Couchdb,Pouchdb,我在CouchDB的同一个文档中存储了约2500个图像作为附件。这些图像在硬盘上约占15MB,由此产生的CouchDB约为17MB 当我通过PockDB将此文档推送到我的客户机时,我看到生成的数据库超过40MB。我按照以下步骤进行了一些测试: 将X图像附件上载到CouchDB文档 紧凑CouchDB 完全清除客户端缓存 重新加载客户端(在我的应用程序中,我在重新加载时复制数据) 结果是: number of attached files | Total size (KB) in HD | Inc

我在CouchDB的同一个文档中存储了约2500个图像作为附件。这些图像在硬盘上约占15MB,由此产生的CouchDB约为17MB

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

  • 将X图像附件上载到CouchDB文档

  • 紧凑CouchDB

  • 完全清除客户端缓存

  • 重新加载客户端(在我的应用程序中,我在重新加载时复制数据)

  • 结果是:

    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
    
    因此,似乎:

  • PockDB向每个附件添加大约2K个控制数据

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

  • 图像在CouchDB和PockDB中都有内容类型:image/png。我知道这会阻止将它们存储为base64。我说得对吗

    有人以前见过这个吗?有人能解决这个问题吗? 在iOS 50MB空间限制内安装应用程序时,这是一个大问题

    编辑

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

  • 文件1:orig大小=7.4K/DB大小=10.2K

  • 文件2:orig大小=5.1K/DB大小=6.8K

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


    那么,为了避免PockDB中二进制大小的增加,还需要做些什么呢?

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

    编辑:刚刚意识到你说的是Chrome,但我保留了原始答案给后代:)

    • 在Node.js中,我们使用LevelDB via,它将二进制数据直接存储在磁盘上
    • 在Safari/iOS中,我们使用WebSQL,它存储二进制blob,因此同样没有开销
    • 在其他方面,我们使用IndexedDB,它在API级别接受Blob对象,除了Chrome,因为Chrome还不支持它()
    我猜你是在测试Chrome。因此,您看到性能差的原因是,我们必须将所有内容都存储在base64中作为解决方法()

    好的一面是,Chromium bug非常活跃(上一次评论是48小时前),所以Chrome团队可能正在关注它,并将很快发布修复程序。当他们这样做时,PockDB将自动检测到blob支持可用并开始使用它


    更新:Chrome团队解决了这一问题,从Chrome v43开始,PockDB支持Blob.:)

    我主要使用Chrome(良好的工具)进行测试。但也尝试了iOS Safari。在那里,我看到了同样的问题,当加载整个数据库时,iOS中专门用于web应用程序的空间约为43MB,而不是20MB左右。所以至少这个问题要问IndexedDB和WebSQL。您是否压缩了客户端数据库?如果在初始复制之前进行压缩,服务器上的压缩只会影响客户端。在Chrome中可以尝试的另一件事是使用新的PockDB('dbname',{adapter:'websql'}),以便查看sqlite数据库的外观。Chrome同时支持IndexedDB和WebSQL。啊,我刚刚想到,在iOS中,大小几乎是原来的两倍(43MB对20MB),因为iOS/Safari将二进制数据强制转换为UTF-16。因此,对于PNG数据,每一个字节都有一个额外的\u0000字节。我不确定,但是可能会有不同的行为,所以你可能想试试。使用websql可以解决Chrome中的问题。