是1亿份文件太多了吗?

时间:2013-06-08 13:17:26

标签: mongodb mongo-shell

嗯,我是mongo的新手,今天早上我有一个(糟糕的)想法。我正在玩shell中的索引,并决定创建一个包含许多文档(1亿)的大型集合。所以我执行了以下命令:

for (i = 1; i <= 100; i++) { 
    for (j = 100; j > 0; j--) { 
        for (k = 1; k <= 100; k++) { 
            for (l = 100; l > 0; l--) {
                db.testIndexes.insert({a:i, b:j, c:k, d:l})
            }
        }
    }
}

然而,事情并没有像我预期的那样:

  1. 完成请求需要45分钟。
  2. 它在我的硬盘上创建了16 GB的数据。
  3. 它占用了我80%的RAM(总共8GB),直到我重新启动PC才会释放它们。
  4. 正如您在下面的照片中看到的那样,随着收藏中文档的数量不断增加,文档插入的时间也在增长。我建议通过数据文件的最后修改时间:

    enter image description here

    这是预期的行为吗?我认为1亿份简单文件太多了。

    P.S。我现在真的害怕运行ensureIndex命令。

    修改

    我执行了以下命令:

    > db.testIndexes.stats()
    {
            "ns" : "test.testIndexes",
            "count" : 100000000,
            "size" : 7200000056,
            "avgObjSize" : 72.00000056,
            "storageSize" : 10830266336,
            "numExtents" : 28,
            "nindexes" : 1,
            "lastExtentSize" : 2146426864,
            "paddingFactor" : 1,
            "systemFlags" : 1,
            "userFlags" : 0,
            "totalIndexSize" : 3248014112,
            "indexSizes" : {
                    "_id_" : 3248014112
            },
            "ok" : 1
    }
    

    因此,_id上的默认索引大小超过3GB。

2 个答案:

答案 0 :(得分:2)

  

完成请求需要45分钟。

并不感到惊讶。

  

它在我的硬盘上创建了16 GB的数据。

由于@Abhishek表示一切似乎都很好,MongoDB确实使用了相当大的空间而没有压缩(希望以后会有所改进)。

似乎数据大小约为7.2GB,而平均对象大小为72字节,似乎这是完美的工作(因为72字节适合7.2GB)与_id索引的3GB开销似乎存储10GB的大小非常适合。

虽然我担心它的使用量超过了统计数据所需的6GB,但可能需要更多研究。我猜这是因为MongoDB如何写入数据文件,甚至可能是因为你没有使用非火并忘记写关注(w>0),总而言之;嗯。

  

它使用了我80%的RAM(总共8GB),直到我重新启动PC才会释放它们。

MongoDB将尝试占用操作系统允许的RAM。如果操作系统需要80%,那么它需要80%。这实际上是一个好兆头,它表明MongoDB具有正确的配置值来有效地存储您的工作集。

运行ensureIndex mongod时永远不会释放RAM。它根本就没有钩子,相反,操作系统会缩小其分配的块以便为更多(或者应该)腾出空间。

答案 1 :(得分:1)

这是一种预期的行为,mongo db文件以filesize 16MB(test.0)开头,并且增长到2GB然后2GB是恒定的。

1亿个(16 GB)文件。 你可以运行ensureIndex,它不应该花费太多时间。

你不需要重启你的电脑,当其他进程需要RAM,mongod将释放RAM。

仅供参考:test.12完全是空的。

我猜你不是只担心1亿份文件的16GB大小?