2014-07-25 6 views
6

मेरे पास 0.7 जीबी मोंगोडीबी डेटाबेस है जिसमें ट्वीट्स हैं जो मैं डेटाफ्रेम में लोड करने की कोशिश कर रहा हूं। हालांकि, मुझे एक त्रुटि मिलती है।पांडस और पायमोंगो का उपयोग करके डेटाफ्रेम पर मोंगोडीबी डेटा लोड करने का एक बेहतर तरीका?

MemoryError:  

मेरे कोड इस तरह दिखता है:

cursor = tweets.find() #Where tweets is my collection 
tweet_fields = ['id'] 
result = DataFrame(list(cursor), columns = tweet_fields) 

मैं निम्नलिखित जवाब में तरीकों, जो कुछ बिंदु पर यह लोड करने से पहले डेटाबेस के सभी तत्वों की एक सूची बना कोशिश की है।

हालांकि,) एक और जवाब जो सूची (बारे में बात करती है, उस व्यक्ति ने कहा है कि यह, छोटे डेटा सेट के लिए अच्छा है, क्योंकि सब कुछ स्मृति में भरी हुई है।

मेरे मामले में, मुझे लगता है कि यह त्रुटि का स्रोत है। यह स्मृति में लोड होने के लिए बहुत अधिक डेटा है। मैं किस और विधि का उपयोग कर सकता हूं?

उत्तर

7

मैं निम्नलिखित करने के लिए अपने कोड को संशोधित किया गया है:

cursor = tweets.find(fields=['id']) 
tweet_fields = ['id'] 
result = DataFrame(list(cursor), columns = tweet_fields) 

खोज() फ़ंक्शन मैं उत्पादन प्रतिबंधित में क्षेत्रों पैरामीटर जोड़ कर। जिसका अर्थ है कि मैं हर फ़ील्ड लोड नहीं कर रहा हूं बल्कि केवल चयनित फ़ील्ड को डेटाफ्रेम में लोड कर रहा हूं। सब कुछ ठीक काम करता है।

4

आपके मामले में, जैसा कि आपके मामले में, monary का उपयोग करेगा, एक mongodb क्वेरी से डेटाफ्रेम बनाने के लिए सबसे तेज़, और संभावित रूप से सबसे अधिक मेमोरी-कुशल तरीका है।

This post में एक अच्छा और संक्षिप्त स्पष्टीकरण है।

0

कर यह इस प्रकार होगा की एक सुंदर तरीका:

import pandas as pd 
def my_transform_logic(x): 
    if x : 
     do_something 
     return result 

def process(cursor): 
    df = pd.DataFrame(list(cursor)) 
    df['result_col'] = df['col_to_be_processed'].apply(lambda value: my_transform_logic(value)) 

    #making list off dictionaries 
    db.collection_name.insert_many(final_df.to_dict('records')) 

    # or update 
    db.collection_name.update_many(final_df.to_dict('records'),upsert=True) 


#make a list of cursors.. you can read the parallel_scan api of pymongo 

cursors = mongo_collection.parallel_scan(6) 
for cursor in cursors: 
    process(cursor) 

मैं ऊपर कोड पर Joblib का उपयोग कर 26 लाख रिकॉर्ड के साथ एक MongoDB संग्रह पर उपरोक्त प्रक्रिया की कोशिश की। मेरे कोड ने किसी भी मेमोरी त्रुटियों को फेंक नहीं दिया और प्रसंस्करण 2 बजे समाप्त हो गया।

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