2

简而言之:当我将具有多个字段的 JSON 对象保存在 MongoDB 的单个字符串字段中或将 JSON 对象的每个字段保存在其自己的 MongoDB 字段中时,插入速度存在巨大差异。1)这种差异正常吗?2) 这些插入速度是典型的吗?

我有许多记录,每个记录都有一个唯一的字符串 id 和 600 个整数值。它们已经在文件中表示为 JSON 对象——每个文档在单独的行中。如果我将 MongoDB 文档表示为整数字段的集合并将我的唯一 id 放入 MongoDB 的字段中,我每秒_id可以插入大约50 个文档。如果我改为创建一个只有两个字段的文档(对于唯一的字符串 id,以及作为保留整个 JSON 记录行的单个字符串),我每秒可以插入大约 100 个文档_idval

我正在使用 Python 客户端并尝试进行批量插入(例如,一次 10、100、1000 个)。差异总是存在的。这种行为是预期的吗?我天真地假设我不会看到差异,因为 MongoDB 本身将记录保存为 BSON,并且在 600 个字段中每个字段都有一个整数或一个包含 JSON 记录的单个字符串之间确实应该没有太大区别,反过来,保留 600 个整数。

附录:1)我在这两种情况下都将 JSON 转换为字典,以确保它不会影响速度测量(即json.loads和其他东西)。换句话说,在带有 JSON 字符串的单字段的情况下,我会做我在另一种情况下所做的一切,但忽略转换后的字典。

2)我还尝试了空运行,一切都完好无损,没有任何插入到 MongoDB。我每秒可以处理大约 700-800 行。

3)

a. db.test.stats() in single-line-single field case (i.e. fast case):
{
    "ns" : "tmp.test",
    "count" : 7999,
    "size" : 71262392,
    "avgObjSize" : 8908.91261407676,
    "storageSize" : 88751616,
    "numExtents" : 9,
    "nindexes" : 1,
    "lastExtentSize" : 21742848,
    "paddingFactor" : 1,
    "flags" : 1,
    "totalIndexSize" : 466944,
    "indexSizes" : {
        "_id_" : 466944
    },
    "ok" : 1
}

b. db.test.stats() (each column to a separate case; i.e., slow case):
{
    "ns" : "tmp.test",
    "count" : 7999,
    "size" : 85710500,
    "avgObjSize" : 10715.15189398675,
    "storageSize" : 107561984,
    "numExtents" : 9,
    "nindexes" : 1,
    "lastExtentSize" : 26091264,
    "paddingFactor" : 1,
    "flags" : 1,
    "totalIndexSize" : 466944,
    "indexSizes" : {
        "_id_" : 466944
    },
    "ok" : 1
}
4

1 回答 1

3

如果可能,启用 C 扩展,因为它们将提供显着的性能改进。我认为速度上的差异是由于必须将大量键序列化(通过纯 Python 代码,因为您禁用了扩展)到 BSON 文档中。启用 C 扩展后,这将快得多(但仍必须这样做),所以我怀疑您仍然会看到两种方法之间的速度差异(非常轻微)。

Edit: Note that when I say "enable the C extensions," I mean re-build pymongo, or use a pre-built binary for your platform that has the C modules built. You can see the available binary packages at http://pypi.python.org/pypi/pymongo/2.0.1#downloads

于 2011-08-19T18:23:04.397 回答