4

いくつかの大きなファイル (約 400 万レコード) を mongo インスタンスにプッシュしようとしています。私が基本的に達成しようとしているのは、既存のデータをファイルのデータで更新することです。アルゴリズムは次のようになります。

rowHeaders = ('orderId', 'manufacturer', 'itemWeight')
for row in dataFile:
    row = row.strip('\n').split('\t')
    row = dict(zip(rowHeaders, row))

    mongoRow = mongoCollection.find({'orderId': 12344})
    if mongoRow is not None:
        if mongoRow['itemWeight'] != row['itemWeight']:
            row['tsUpdated'] = time.time()
    else:
        row['tsUpdated'] = time.time()

    mongoCollection.update({'orderId': 12344}, row, upsert=True)

ですので、重みが同じなら「tsUpdated」以外の行全体を更新し、行がmongoにない場合は新しい行を追加するか、「tsUpdated」を含む行全体を更新する...これがアルゴリズムです

問題は、モンゴの観点から、これをより速く、より簡単に、より効率的に行うことができるかということです。(最終的には、ある種の一括挿入を使用)

4

1 に答える 1

6

の一意のインデックスをorderId、 の変更もチェックする更新クエリと組み合わせますitemWeight。一意のインデックスは、タイムスタンプorderIdが既に存在しitemWeight、同じである場合、変更されたタイムスタンプのみの挿入を防ぎます。

mongoCollection.ensure_index('orderId', unique=True)
mongoCollection.update({'orderId': row['orderId'],
    'itemWeight': {'$ne': row['itemWeight']}}, row, upsert=True)

私のベンチマークは、アルゴリズムに対して 5 倍から 10 倍のパフォーマンスの向上を示しています (挿入と更新の量によって異なります)。

于 2010-10-17T13:13:14.983 に答える