1

我是 MongoDB 新手,我有一个包含以下字段的集合:

> db.TestTable.findOne()
{
        "_id" : ObjectId("527c48e99000cf10bc2a1d82"),
        "ID" : "16587",
        "Name" : "N15247",
        "Serial1" : "11",
        "Serial2" : "727",
        "DateTime" : ISODate("1998-12-15T18:30:00Z"),
        "CompID" : "ID465",
        "CompName" : "F1460"
}

我使用 BsonDocument 使用 ac# 驱动程序将大约 300,000,000 个文档插入到集合中。集合的大小是:

> db.TestTable.stats()
{
        "ns" : "FeatureParser.LogsTable",
        "count" : 300000000,
        "size" : 62399477600,
        "avgObjSize" : 207.99825866666666,
        "storageSize" : 68783787568,
        "numExtents" : 54,
        "nindexes" : 2,
        "lastExtentSize" : 2146426864,
        "paddingFactor" : 1,
        "systemFlags" : 1,
        "userFlags" : 0,
        "totalIndexSize" : 14878186064,
        "indexSizes" : {
                "_id_" : 9746789472,
                "dateTime_1" : 5131396592
        },
        "ok" : 1
}

MongoDB 是否为插入的文档占用了这么多空间?无论如何可以减少数据库的大小吗?

提前致谢。

4

3 回答 3

3

值得期待

目前尚不清楚以何种方式存储的大小被认为是巨大的——预期的大小是多少?

我插入了大约 [300M] 个文档

每行大约 200 个字节:

{"_id" : ObjectId("527c48e99000cf10bc2a1d82"),"ID" : "16587","Name" : "N15247","Serial1" : "11","Serial2" : "727","DateTime" : ISODate("1998-12-15T18:30:00Z"),"CompID" : "ID465","CompName" : "F1460"}
^199 chars

报告/确认为:

“avgObjSize”:207.99825866666666 [字节]

总数据大小为:

“大小”:62399477600 [字节]

所以:

    300, 000, 000 rows x
              200 bytes per row
60, 000, 000, 000 bytes

这只是证实了插入数据的估计值非常接近集合中数据的大小(62GiB v 60GiB)。

实际存储大小为68, 783, 787, 568(68GiB),也非常接近数据大小,不同之处在于索引开销和存储空间的预分配。

因此,观察到的结果很容易预料到。如果上述不是什么意思 - 请通过编辑问题来澄清。

于 2013-11-12T10:38:30.310 回答
3

来自http://docs.mongodb.org/manual/faq/storage/

预分配的数据文件。
在数据目录中,MongoDB 将数据文件预分配到特定大小,部分是为了防止文件系统碎片。MongoDB 将第一个数据文件命名为 .0,下一个 .1 等。mongod 分配的第一个文件是 64 兆字节,接下来是 128 兆字节,依此类推,最多 2 GB,此时所有后续文件都是 2 GB。数据文件包括已分配空间但不包含数据的文件。mongod 可能会分配一个 90% 为空的 1 GB 数据文件。对于大多数较大的数据库,与数据库相比,未使用的分配空间很小。

于 2013-11-12T10:24:20.170 回答
1

人们已经提出了为什么收藏如此之大的原因,所以我不会改写他们的话,而是要解决第二个问题。如何减小集合的大小。

有一种很好的方法可以减少您的收藏的大小。

由于 mongodb 为每个文档存储键,因此您可以通过缩短名称来显着减小集合的大小。这样,您将收集到这样的文档:

{
        "_id" : ObjectId("527c48e99000cf10bc2a1d82"),
        "ID" : "16587",
        "n" : "N15247",
        "s" : "11",
        "c" : "727",
        "d" : ISODate("1998-12-15T18:30:00Z"),
        "c" : "ID465",
        "f" : "F1460"
}

在您的应用程序层上,您可以创建从这些神秘名称到普通名称的映射。

于 2013-11-12T10:46:09.363 回答