找出字段中二进制数据的HDD使用情况

时间:2013-08-05 21:30:22

标签: mongodb pymongo

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

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

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()是否有意义?

1 个答案:

答案 0 :(得分:0)

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

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

执行此操作
db.files.stats()

其中包含字段storageSize,可显示您的图片大约需要多少存储空间。这并不像通过所有图像那样准确。