【问题标题】:MongoDB insert speed trade-offsMongoDB 插入速度权衡
【发布时间】:2011-10-30 18:13:55
【问题描述】:

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

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

我正在使用 Python 客户端并尝试进行批量插入(例如,一次 10、100、1000)。差异总是存在的。 这种行为是意料之中的吗?我天真地假设我不会看到差异,因为 MongoDB 本身将记录保存为 BSON,并且每个字段都具有整数或包含 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
}

【问题讨论】:

  • 您的时间测量是否包括在 python 中在插入之前将字符串转换为字典的时间?您的收藏有哪些索引?再详细一点,我们也许可以帮助...
  • 是的,但无论如何我都会在这两种情况下进行转换。请参阅我的编辑以获取扩展回复。
  • 你运行的是什么版本的pymongo?
  • 如果您可以从 mongo shell 显示 db.yourcollection.stats() 的输出,也会有所帮助。
  • 最后一件事——请检查您的 pymongo 版本是否安装了 C 扩展并在 Python 交互式 shell 中通过 >>> pymongo.has_c() 运行(应该是 True

标签: python json mongodb bson


【解决方案1】:

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

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

【讨论】:

  • 启用 C 扩展(为此我需要安装 python-dev),我每秒获得 500 次插入,每个整数在单独的字段中。谢谢!
  • 出于好奇,您使用的是什么发行版?你是如何安装 pymongo 的,easy_installpip
  • Ubuntu Hardy,我使用了 easy_install。我记得在安装过程中出现了一些关于缺少 python-dev 的警告,但我当时并没有注意它们:)
猜你喜欢
  • 2017-07-20
  • 2016-06-25
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 2012-08-09
  • 1970-01-01
相关资源
最近更新 更多