0

これが私の問題です。単語とそれが発生する回数があるmongodbでコレクションを作成したいと思います。私はPythonでそれをやっていて、それは非常に遅いです。これはおそらく、私が持っているすべての単語について、それがすでにデータベースにあるかどうかを確認し(* find_one *を使用)、ある場合はその頻度を取得し、増分して保存します(updateを使用)。そこにない場合は、リストに追加して定期的に一括挿入します。

これを行うためのより良い方法はありますか?単語の数は膨大です(異なる言語が可能です)。そもそもmongoDBは正しいものですか?インストールが非常に簡単で、チュートリアルを10分で取得したため、mongoDBを選択しました...

編集-コードも追加しました。私が大きいと言うとき、私はそれらの中に単語が含まれている約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と呼んでいます。すべての単語に対して。

4

1 に答える 1

0

upsertsを使用できるようです。アップサートを使用する場合、そのフェッチ/保存サイクルを実行する必要はありません。

Python ドライバーでこれがどのように行われるかはわかりませんが、JavaScript では次のようになります。

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

MongoDB は _id フィールドのインデックスを自動的に作成します。単語に _id フィールドを使用していない場合は、キーのインデックスを作成すると、おそらく非常に役立ちます。


編集:あなたのためのいくつかのアイデア

大量のデータがあるため、単語に _id フィールドを使用できます。この方法では、別のインデックスを作成する必要がなく、新しいドキュメントを挿入するときに更新する必要があるインデックスは 1 つだけなので、更新はわずかに高速になります。これは、挿入速度がボトルネックの場合です。

一般に、大量のデータを挿入する場合はバッチ挿入を利用することをお勧めしますが、この場合に役立つかどうかはわかりません。これは、データによって異なります。一意の単語の比率が高い場合は、バッチ挿入が便利な場合があります。しかし、同じ単語が何度も使用される場合 (これはほとんどの言語に当てはまると思います)、バッチ挿入はあまり役に立たない可能性があります。

また、バッチ挿入に問題があるようです。初めて言葉に出くわした場合を考えてみてください。挿入リストに挿入されます。ここで、前のバッチが挿入されていない間にこの同じ単語が再び検出された場合、この単語の数値属性は 1 になりますが、これは正しくありません。

データベースがボトルネックであると確信していますか? 他にパフォーマンスの悪いコードがないことを確認しましたか? しかし、とにかく、4GB のデータを挿入するには、いずれにしても時間がかかると思います。

于 2012-11-23T06:32:29.190 に答える