【问题标题】:Updating multiple counters in a single command with pymongo使用 pymongo 在单个命令中更新多个计数器
【发布时间】:2019-07-02 15:37:12
【问题描述】:

我正在处理一些文本文件以搜索模式并对其进行计数。由于文件非常大,处理时间是一个重要问题。我有一个 python 代码可以更新计数器并将其存储在 mongodb 中。为了让它更快地工作,我试图减少数据库操作的数量。

原始版本每次出现都递增:

mlcol.find_one_and_update(
    {"connip": conip}, 
    {"$inc":{ts:1}}, 
    upsert=True
)

由于这需要很长时间,我所做的就是将计数器保存在内存中、字典中,并定期检查这些数据来存储它:

for conip in conCounter.keys():
    d = conCounter[conip]
    for ts in d.keys():
        mlcol.find_one_and_update(
            {"connip": conip}, 
            {"$inc":{ts:d[ts]}}, 
            upsert=True
        )

这种方式的过程要快得多,但我发现单独更新每个计数器仍然需要很长时间。

有没有办法在一个命令中启动多个更新?

还有什么其他的想法可以让这个过程更快吗?

【问题讨论】:

  • 首先索引mlcol by connip。然后尝试使用bulk updates 它应该可以节省往返行程。

标签: python mongodb pymongo


【解决方案1】:

正如 Alex Blex 所解释的,创建索引和批量执行解决了这个问题:

mlcol.create_index("connip")


bulk=mlcol.initialize_unordered_bulk_op()
for conip in conCounter.keys():
    d = conCounter[conip]
    for ts in d.keys():
        bulk.find({"connip": conip}).upsert().update({"$inc":{ts:d[ts]}})
res=bulk.execute()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-30
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2011-03-09
    • 1970-01-01
    • 2015-12-13
    相关资源
    最近更新 更多