mongo数据库的快速更新

2024-04-16 16:06:16 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的问题。我想在mongodb中创建一个集合,在那里我有一个单词和它出现的次数。我用python写,速度非常慢。这很可能是因为对于我拥有的每个单词,我都会检查它是否已经在数据库中(使用 *找到_one*),如果是,得到它的频率,增加它并存储回(使用update)当然,当单词不在那里时,我会将它附加到一个列表中,并定期进行批量插入。在

有更好的方法吗?单词的数量是巨大的(可能有不同的语言)。首先使用mongoDB是正确的吗?我选择mongoDB是因为它很容易安装到,我在10分钟内就学会了教程。。。在

编辑-也添加了代码。当我说大的时候,我指的是一个4GB大小的文件,里面有单词。。。在

insertlist = []

def copy_to_db(word):
    global insertlist

    wordCollection = db['words']
    occurrence = wordCollection.find_one({'word' : word})
    if occurrence:
            n = occurrence['number']
            n = n + 1
            wordCollection.update({'word' : word}, {'$set' : {'number' : n}})
    else:
            insertlist.append({'word' : word, 'number' : 1})
            #wordCollection.insert({'word' : word, 'number' : 1})

    if len(insertlist) >= 5000:
            print("insert triggered ... ")
            wordCollection.insert(insertlist)
            insertlist = []

我叫它func。每一个字。在


Tags: numberdbifmongodbupdate单词次数one
1条回答
网友
1楼 · 发布于 2024-04-16 16:06:16

听起来你可以用upserts。如果使用upserts,则不需要执行该获取/保存循环。在

我不确定在python驱动程序中是如何实现的,但在JavaScript中,它看起来像:

db.words.update({"_id": "the_word" }, {"$inc": {"frequency": 1}}, true)

MongoDB会自动为_id字段创建索引。如果您的单词没有使用\u id字段,那么为键创建索引可能会有很大帮助。在


编辑:给你一些建议

因为有很多数据,你可以使用你的单词的'u id字段。这样您就不需要创建另一个索引,并且更新速度会稍微快一些,因为在插入新文档时只需要更新一个索引。这是为了防止插入速度成为瓶颈。在

虽然在插入大量数据时,利用批插入通常是一个好主意,但我不确定它对这种情况是否有太大帮助。这取决于你的数据。如果唯一单词的比率很高,那么批量插入可能会很方便。但是如果相同的单词被反复使用(我想大多数语言都是这样),那么批插入可能不会有太大帮助。在

另外,批插入中似乎有问题。想想如果你第一次遇到一个词。它将插入到您的insertlist中。现在,如果在上一批未插入的情况下再次遇到同一个单词,则该单词的number属性将为1,这是不正确的。在

你确定数据库是瓶颈吗?您是否已经确定没有其他性能较差的代码?但无论如何,我想,无论如何,插入4GB的数据都需要一段时间。在

相关问题 更多 >