在包含图像(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()
是否有意义?
答案 0 :(得分:0)
您无法避免将所有数据加载到内存中。 MongoDB将文档视为其原子单元,通过查询所有文档,它将所有文档都拉入内存。
作为替代方案,可能对您有所帮助的只是查看集合占用的字节数,但这当然只有在您的集合中存储的唯一内容是图像时才有效。在shell上,您可以使用:
执行此操作db.files.stats()
其中包含字段storageSize
,可显示您的图片大约需要多少存储空间。这并不像通过所有图像那样准确。