GridFS和chunkSize - 我们的GridFS数据库与存储的实际数据/文件相比太大了

时间:2017-05-18 13:36:54

标签: mongodb gridfs

我们在生产中使用MongoDB(v.3.4)作为主数据存储。我们广泛使用GridFS,而db正在增长,我们的大小也存在一些重大问题。我们有cca。在GridFS中上传的8000个文件(使用Java驱动程序)...文件长度的总和约为30GB,但数据库的大小为350GB ...因此它的大10倍。我们看不到除chunkSize之外的任何原因。我们在db中有几个大文件,但是大多数文件都小于默认的256kB chunkSize,请参见下面的示例。

我已经阅读了一些不用担心的discussions,真正的存储只需要文件大小加上一些字节。但它在我们的数据库中看起来并不像。有人可以确认这应该如何工作?我们有副本集,其中数据库大小为350Gb的奴隶,所以它似乎不是一些数据库损坏问题。我们尝试了一些数据库清理......但没办法。

{
    "_id" : ObjectId("572c6877f0ea0bbab3b67015"),
    "metadata" : {
        "id" : "F735ADCACB662DD5C1257FAB0023B5CC",
        "name" : "file"
    },
    "filename" : "1150228.jpg",
    "aliases" : null,
    "chunkSize" : NumberLong(261120),
    "uploadDate" : ISODate("2016-05-06T09:48:39.136Z"),
    "length" : NumberLong(36368),
    "contentType" : null,
    "md5" : "fd3393af027e0f1ff799ac4b1c117d58"
}

编辑1:我将mongofiles -d database list放入文件并在Excel中打开并调出文件大小,显示35GB。

解决: 我运行了建议的命令mongo --quiet --eval 'db.fs.chunks.aggregate([{$group:{_id: "$files_id", chunks: {$sum: 1}}}]).forEach(function(f){print(f._id + "\t" + f.chunks)})'以通过file_id和相关的块数聚合块收集。在长文件中,我发现只有一个带有> 20个百万块的块,导致了这个问题。现在很容易删除所有这些块然后缩小数据库......

1 个答案:

答案 0 :(得分:0)

我运行了建议的命令

mongo --quiet --eval 'db.fs.chunks.aggregate([{$group:{_id: "$files_id", chunks: {$sum: 1}}}]).forEach(function(f){print(f._id + "\t" + f.chunks)})' 

通过file_id和相关的块数聚合块集合。在长文件中,我发现只有一个带有> 20个百万块的块,导致了这个问题。现在很容易删除所有这些块然后缩小数据库......