0

在具有image包含图像 (BinData) 的字段的集合中。我想知道图像使用了多少% 的数据库。计算所有图像总大小的最有效方法是什么?

我想避免从数据库服务器获取所有图像,所以我想出了这段代码:

mapper = Code("""
           function() {
             var n = 0;
             if (this.image) {
               n = this.image.length();
             }
             emit('sizes', n);
           }
           """)
reducer = Code("""
               function(key, sizes) {
                 var total = 0;
                 for (var i = 0; i < sizes.length; i++) {
                   total += sizes[i];
                 }
               }
               return total;
               """)
result = db.files.map_reduce(mapper, reducer, "image_sizes")

在 mongodb 的执行过程中,内存使用率非常高,看起来好像整个数据都加载到了内存中。如何优化?this.image.length()此外,调用以找出图像在硬盘驱动器上占用的字节数是否有意义?

4

1 回答 1

0

您无法避免将所有数据加载到内存中。MongoDB 将文档视为其原子单元,通过查询所有文档,它将所有文档拉入内存。

作为替代方案,可能对您有帮助的只是查看集合占用了多少字节,但这当然只有在您存储在集合中的唯一内容是图像时才有效。在 shell 上,你可以这样做:

db.files.stats()

哪个字段storageSize显示您的图像大约需要多少存储空间。但是,这并不像浏览所有图像那样准确。

于 2013-08-06T14:34:26.313 回答