2010-09-28 6 views
4

J'essaye de pousser quelques gros fichiers (environ 4 millions d'enregistrements) dans une instance de mongo. Ce que j'essaie de faire, c'est de mettre à jour les données existantes avec celles des fichiers. L'algorithme ressemblerait à quelque chose comme:pymongo: une mise à jour plus efficace

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) 

Donc, mettre à jour toute la ligne en plus « tsUpdated » si les poids sont les mêmes, ajouter une nouvelle ligne si la ligne n'est pas mongo ou mettre à jour toute la ligne, y compris « tsUpdated » ... c'est l'algorithme

La question est: est-ce que cela peut être fait plus rapidement, plus facilement et plus efficacement du point de vue de mongo? (Éventuellement avec une sorte d'insert en vrac)

Répondre

5

Combiner un index unique sur orderId avec une requête de mise à jour où vous vérifiez également un changement de itemWeight. L'index unique empêche un insert avec seulement un timestamp modifié si le orderId est déjà présent et itemWeight est le même. Mon test de performance montre une amélioration des performances 5-10x par rapport à votre algorithme (en fonction du nombre d'insertions par rapport aux mises à jour).

Questions connexes