2016-09-23 13 views
6

मैं थोक अद्यतन करने के लिए pymongo का उपयोग कर रहा हूँ।थोक अद्यतन बहुत धीमा है

bulk = db.collection.initialize_unordered_bulk_op() 
for name in names: 
    bulk.find({"A":{"$exists":False},'Name':name}).update({"$set":{'B':b,'C':c,'D':d}}) 
print bulk.execute() 

कोड 2:

bulk = db.collection.initialize_unordered_bulk_op() 
counter = 0 
for name in names: 
    bulk.find({"A":{"$exists":False},'Name':name}).update({"$set":{'B':b,'C':c,'D':d}}) 
    counter =counter + 1 
    if (counter % 100 == 0): 
     print bulk.execute() 
     bulk = db.collection.initialize_unordered_bulk_op() 
if (counter % 100 != 0): 
    print bulk.execute() 

नीचे नाम सूची के नाम (प्रत्येक नाम संग्रह में एकाधिक दस्तावेज़ों हो सकता है) की एक अलग सूची

कोड 1 है

मेरे संग्रह में मेरे पास 50000 दस्तावेज हैं। यदि मैं काउंटर से छुटकारा पाता हूं और यदि कथन (कोड 1), कोड अटक गया है! अगर कथन (कोड 2) के साथ, मुझे लगता है कि इस ऑपरेशन को कुछ मिनट से ज्यादा समय नहीं लेना चाहिए, लेकिन इससे अधिक रास्ता ले रहा है! क्या आप कृपया इसे तेजी से बनाने में मेरी मदद कर सकते हैं या क्या मैं अपनी धारणा में गलत हूं ?!

उत्तर

6

आप अपने प्रश्नों का समर्थन करने के लिए सूचकांक जोड़ने की संभावना सबसे अधिक संभावना है! यह आपके प्रत्येक ऑपरेशन के लिए पूर्ण संग्रहण स्कैन ट्रिगर करेगा जो धीमा उबाऊ है (जैसा कि आपने महसूस किया था)।

निम्न कोड update_many का उपयोग करके परीक्षण करता है, और 'नाम' और 'ए' फ़ील्ड पर इंडेक्स के बिना और थोक सामान। आपके द्वारा प्राप्त की जाने वाली संख्याएं स्वयं के लिए बोलती हैं।

टिप्पणी, मैं इंडेक्स के बिना 50000 के लिए ऐसा करने के लिए पर्याप्त नहीं था लेकिन 10000 दस्तावेजों के लिए। 10000 के लिए परिणाम हैं:

    सूचकांक और update_many बिना
  • : 38.6 सेकंड
  • सूचकांक और बहु-अपडेट के बिना: 28.7 सेकंड
  • सूचकांक और update_many साथ
  • : 3.9 सेकंड
  • सूचकांक और बहु-अपडेट के साथ
  • : 0.52 सेकंड

अतिरिक्त सूचकांक वाले 50000 दस्तावेज़ों के लिए 2.67 सेकंड लगते हैं। मैंने एक विंडोज़ मशीन पर परीक्षण चलाया और डॉकर में उसी मेजबान पर चलने वाला मोंगो चलाया।

अनुक्रमणिका के बारे में अधिक जानकारी के लिए https://docs.mongodb.com/manual/indexes/#indexes देखें। संक्षेप में: इंडेक्स रैम में रखा जाता है और तेजी से पूछताछ और दस्तावेज़ों की तलाश करने की अनुमति देता है। इंडेक्स को विशेष रूप से अपने प्रश्नों से मेल खाना चुनना होगा।

from pymongo import MongoClient 
import random 
from timeit import timeit 


col = MongoClient()['test']['test'] 

col.drop() # erase all documents in collection 'test' 
docs = [] 

# initialize 10000 documents use a random number between 0 and 1 converted 
# to a string as name. For the documents with a name > 0.5 add the key A 
for i in range(0, 10000): 
    number = random.random() 
    if number > 0.5: 
     doc = {'name': str(number), 
     'A': True} 
    else: 
     doc = {'name': str(number)} 
    docs.append(doc) 

col.insert_many(docs) # insert all documents into the collection 
names = col.distinct('name') # get all distinct values for the key name from the collection 


def update_with_update_many(): 
    for name in names: 
     col.update_many({'A': {'$exists': False}, 'Name': name}, 
         {'$set': {'B': 1, 'C': 2, 'D': 3}}) 

def update_with_bulk(): 
    bulk = col.initialize_unordered_bulk_op() 
    for name in names: 
     bulk.find({'A': {'$exists': False}, 'Name': name}).\ 
      update({'$set': {'B': 1, 'C': 2, 'D': 3}}) 
    bulk.execute() 

print(timeit(update_with_update_many, number=1)) 
print(timeit(update_with_bulk, number=1)) 
col.create_index('A') # this adds an index on key A 
col.create_index('Name') # this adds an index on key Name 
print(timeit(update_with_update_many, number=1)) 
print(timeit(update_with_bulk, number=1)) 
+0

मदद के लिए धन्यवाद, लेकिन मुझे लगता है कि समय है कि आप ऊपर दिया है सही रूप में वे 10000 दस्तावेज़ों के लिए नहीं हैं, लेकिन केवल उन लोगों में से एक आधा (पर विचार> 0.5 और <= 0.5 समान रूप से कर रहे हैं नहीं कर रहे हैं संभावित)। साथ ही, यह मदद करेगा यदि आप साझा कर सकते हैं कि आपने शुरुआती के लिए फ़ील्ड ए और नाम कैसे अनुक्रमित किया था। एक बार फिर धन्यवाद! – amazingCodingExperience

+0

इसके अलावा, प्रक्रिया को कैसे बढ़ाया जाए? क्या आप इसके पीछे सिद्धांत साझा कर सकते हैं? – amazingCodingExperience

+0

मेरे उत्तर में अधिक जानकारी जोड़ा गया। हालांकि, मोंगोडब मुफ्त में बहुत अच्छे ऑनलाइन पाठ्यक्रम प्रदान करता है: https://university.mongodb.com/courses/M101P/about मेरा सुझाव है कि आप इनमें से एक को मोंगो के साथ गति प्राप्त करने के लिए लें। – squanto773

संबंधित मुद्दे