2012-03-20 3 views
7

मुझे पाइथन कोड में मोंगोडीबी (संग्रह नाम "परीक्षण") से पूरा संग्रह पढ़ने की आवश्यकता है। मैं1000 में भाग में संग्रह के माध्यम से कैसे पढ़ा जाए?

self.__connection__ = Connection('localhost',27017) 
    dbh = self.__connection__['test_db']    
    collection = dbh['test'] 

तरह की कोशिश की कैसे 1000 से मात्रा में संग्रह के माध्यम से पढ़ने के लिए (स्मृति अतिप्रवाह से बचने के लिए, क्योंकि संकलन बहुत बड़ा हो सकता है)?

उत्तर

-2

खेद है कि आपको एक यूआरएल ड्रॉप करने के लिए, लेकिन मेरा मानना ​​है कि यह सुंदर ढंग से हल किया जाता है: http://code.activestate.com/recipes/137270-use-generators-for-fetching-large-db-record-sets/

+0

यह मोंगोडीबी प्रश्नों के लिए काम नहीं करता –

5

उपयोग कर्सर। कर्सर में "बैच आकार" चर होता है जो एक क्वेरी करने के बाद प्रति बैच क्लाइंट को कितने दस्तावेज़ भेजे जाते हैं। आपको इस सेटिंग को स्पर्श करने की ज़रूरत नहीं है, हालांकि डिफ़ॉल्ट ठीक है और अधिकांश ड्राइवरों में "गेटमोर" कमांड का आविष्कार करने से जटिलता आपके से छिपी हुई है। मैं pymongo से परिचित नहीं हूँ, लेकिन यह इस तरह काम करता है:

cursor = db.col.find() // Get everything! 

while(cursor.hasNext()) { 
    /* This will use the documents already fetched and if it runs out of documents in it's local batch it will fetch another X of them from the server (where X is batchSize). */ 
    document = cursor.next(); 

    // Do your magic here 
} 
+1

आप पाइथन में यह कैसे करते हैं? –

5

मैं Remon से सहमत हैं, लेकिन आप 1000 के बैच का उल्लेख है, जो अपने जवाब वास्तव में कवर नहीं करता।

cursor.batch_size(1000); 

तुम भी रिकॉर्ड को छोड़ सकते हैं, उदा .:

cursor.skip(4000); 

यह आपके लिए क्या देख रहे है: आप कर्सर पर एक बैच का आकार सेट कर सकते हैं? यह प्रभावी रूप से एक अंकन पैटर्न है। हालांकि, अगर आप बस स्मृति थकावट से बचने की कोशिश कर रहे हैं तो आपको वास्तव में बैच आकार या छोड़ने की आवश्यकता नहीं है।

0
करने के लिए

अजगर 2 में वर्तमान में प्रारंभिक कनेक्शन Pymongo का उपयोग कर बनाने के लिए:

host = 'localhost' 
port = 27017 
db_name = 'test_db' 
collection_name = 'test' 

यहां से उचित जवाब MongoClient

# Connect to MongoDB 
client = MongoClient(host=host, port=port) 
# Make a query to the specific DB and Collection 
dbh = client[dbname] 
collection = dbh[collection_name] 

तो का उपयोग कर कनेक्ट करने के लिए। मैं भाग का उपयोग करके पढ़ना चाहता हूं (आकार 1000 के इस मामले में)।

chunksize = 1000 

उदाहरण के लिए हम तय कर सकते हैं कि हम कितने आकार (चंक्साइज) चाहते हैं।

# Some variables to create the chunks 
skips_variable = range(0, db_aux[collection].find(query).count(), int(chunksize)) 
if len(skips_variable)<=1: 
    skips_variable = [0,len(skips_variable)] 

फिर हम प्रत्येक हिस्सा प्राप्त कर सकते हैं।

for i in range(1,len(skips_variable)): 

    # Expand the cursor and retrieve data 

    data_from_chunk = dbh[collection_name].find(query)[skips_variable[i-1]:skips_variable[i]])) 

इस मामले में क्वेरी query = {} है।

Here मैं मोंगोडीबी से डेटाफ्रेम बनाने के लिए समान विचारों का उपयोग करता हूं। Here मैं कुछ हिस्सों में मोंगोडीबी को लिखने के समान लिखता हूं।

मुझे उम्मीद है कि यह मदद करता है।

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