MongoDB插入速度权衡

时间:2011-08-19 16:03:10

标签: python json mongodb bson

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

我有很多记录,每个记录都有一个唯一的字符串id和600个整数值。它们已在文件中表示为JSON对象 - 每个文档位于单独的行中。如果我将MongoDB文档表示为整数字段的集合并将我的唯一ID放入MongoDB的_id字段中,我可以插入每秒50个文档。如果我改为创建一个只包含两个字段的文档(_id表示唯一字符串id,而val作为单个字符串保存记录的整个JSON行,我可以插入 100每秒文件数

我正在使用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
}

1 个答案:

答案 0 :(得分:3)

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

编辑请注意,当我说“启用C扩展”时,我的意思是重新构建pymongo,或者为构建了C模块的平台使用预先构建的二进制文件。您可以在http://pypi.python.org/pypi/pymongo/2.0.1#downloads

查看可用的二进制包