在mongodb快速更新

时间:2012-11-23 06:11:02

标签: python mongodb pymongo

这是我的问题。我想在mongodb中创建一个集合,其中我有一个单词和它出现的次数。我在python中这样做,而且速度极慢。这很可能是因为对于我拥有的每个单词,我都会检查它是否已经存在于数据库中(使用 * find_one *)如果是,请获取其频率,增加它并将其存储回来(使用 update )当然,当单词不存在时,我将其附加到列表中并定期批量插入

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

修改 - 也添加了代码。当我说大的时候,我的意思是一个大约4 GB的文件,里面有文字......

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 = []
我打电话给这个功能。每一个字。

1 个答案:

答案 0 :(得分:0)

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

我不确定如何在python驱动程序中完成此操作,但在JavaScript中它看起来像:

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

MongoDB自动为_id字段创建索引。如果您没有使用_id字段,那么为您的密钥创建索引很可能会有很大帮助。


编辑:为您提供更多想法

由于有大量数据,您可以使用_id字段作为单词。这样您就不需要创建另一个索引,并且更新会稍微快一些,因为在插入新文档时只需要更新一个索引。这是万一插入速度是瓶颈。

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

此外,您的批量插入中看起来有问题。想想你是否第一次遇到一个单词。它被插入到您的插入列表中。现在,如果在未插入上一批时再次遇到相同的单词,则该单词的数字属性将为1,这将是不正确的。

你确定db是瓶颈吗?你有没有确定没有其他表现不佳的代码?但无论如何,我猜,在任何情况下插入4GB数据都需要一段时间。