2012-12-20 21 views
6

का उपयोग करके बड़े परिणाम सेट प्रोसेसिंग को तेज करें मैं प्रत्येक दस्तावेज़ को किसी विशेष संग्रह में प्राप्त करने के लिए rmongodb का उपयोग कर रहा हूं। यह काम करता है लेकिन मैं लाखों छोटे दस्तावेजों, संभावित रूप से 100 एम या उससे अधिक के साथ काम कर रहा हूं। मैं विधि वेबसाइट पर लेखक ने सुझाव दिया उपयोग कर रहा हूँ:rmongodb

count <- mongo.count(mongo, ns, query) 
cursor <- mongo.find(mongo, query) 
name <- vector("character", count) 
age <- vector("numeric", count) 
i <- 1 
while (mongo.cursor.next(cursor)) { 
    b <- mongo.cursor.value(cursor) 
    name[i] <- mongo.bson.value(b, "name") 
    age[i] <- mongo.bson.value(b, "age") 
    i <- i + 1 
} 
df <- as.data.frame(list(name=name, age=age)) 

यह सैकड़ों या परिणामों के हजारों के लिए ठीक काम करता है cnub.org/rmongodb.ashx लेकिन यह है कि जबकि पाश बहुत बहुत धीमी है। क्या इसे गति देने का कोई तरीका है? शायद मल्टीप्रोसेसिंग का अवसर? किसी भी सुझाव की सराहना की जाएगी। मैं प्रति घंटा 1 एम औसत कर रहा हूं और इस दर पर मुझे डेटा फ्रेम बनाने के लिए केवल एक सप्ताह की आवश्यकता होगी।

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

संपादित करें 2: मुझे डेटा.table के साथ कुछ भाग्य है। इसकी अभी भी चल रहा है, लेकिन जैसे कि यह 12M खत्म हो जाएगा यह लग रहा है 4 घंटे में (यह मेरे वर्तमान परीक्षण सेट है), पर काम चल रहा है, लेकिन अब तक से आदर्श

dt <- data.table(uri=rep("NA",count), 
       time=rep(0,count), 
       action=rep("NA",count), 
       bytes=rep(0,count), 
       dur=rep(0,count)) 

while (mongo.cursor.next(cursor)) { 
    b <- mongo.cursor.value(cursor) 
    set(dt, i, 1L, mongo.bson.value(b, "cache")) 
    set(dt, i, 2L, mongo.bson.value(b, "path")) 
    set(dt, i, 3L, mongo.bson.value(b, "time")) 
    set(dt, i, 4L, mongo.bson.value(b, "bytes")) 
    set(dt, i, 5L, mongo.bson.value(b, "elaps")) 

}

+0

मैं कोई आर प्रोग्रामर नहीं हूं, वास्तव में मैंने इसका कभी भी उपयोग नहीं किया है, फिर भी आप पूरे संग्रह पर फिर से प्रयास करने के बजाय आवश्यक सत्यापन के लिए क्यों नहीं लेते हैं और फिर सत्यापन की आवश्यकता क्यों करते हैं? इस मामले में यह केवल एक के बजाय 6 कर्सर सर्वर-साइड की तरह भेजने के लिए तेज़ होगा। – Sammaye

+0

हू? निश्चित रूप से जबकि लूप में अधिक वैक्टर धीरे-धीरे हो जाता है। करने के लिए और कुछ है। तो इसमें अधिक समय लगता है। या यह गैर-रैखिक है? यह उन चीजों की संख्या के विभिन्न मूल्यों के साथ कैसे व्यवहार करता है जिन पर आप लूपिंग कर रहे हैं? या 'अधिक वैक्टर' से आपका मतलब आयु और नाम जैसी चीजें हैं? अस्पष्ट। – Spacedman

+0

@ सैमाये, यह वही है जो मेरा मतलब है कि प्रत्येक वेक्टर के लिए अलग-अलग लूपिंग करके। मैंने कल रात कोशिश की, उस लूप में एक काउंटर डालें और ऐसा लगता है कि अभी मर गया है, यह कई घंटों के बाद प्रिंटिंग बंद कर दिया। रस्सी बस लटका है। तो इस विधि ने मदद नहीं की। – rjb101

उत्तर

3

आप mongo.find.exhaust विकल्प करके देख सकते हैं

cursor <- mongo.find(mongo, query, options=[mongo.find.exhaust]) 

यह वास्तव में आपके उपयोग के मामले के लिए काम करता है तो यह सबसे आसान तय होगा।

हालांकि rmongodb ड्राइवर को अन्य ड्राइवरों पर उपलब्ध कुछ अतिरिक्त सुविधाएं याद आ रही हैं। उदाहरण के लिए जावास्क्रिप्ट ड्राइवर में Cursor.toArray विधि है। जो सीधे सभी खोज परिणामों को सरणी में डंप करता है। आर चालक के पास mongo.bson.to.list फ़ंक्शन है, लेकिन mongo.cursor.to.list शायद आप जो चाहते हैं वह है। सलाह के लिए ड्राइवर डेवलपर को पिंग करना शायद लायक है।

एक नया संग्रह बनाने के लिए एक हैकी समाधान हो सकता है जिसका दस्तावेज़ मूल दस्तावेजों के 100000 के डेटा "खंड" हैं। तब इनमें से प्रत्येक को mongo.bson.to.list के साथ कुशलता से पढ़ा जा सकता है। मंको सर्वर MapReduce कार्यक्षमता का उपयोग करके खंडित संग्रह का निर्माण किया जा सकता है।

+0

के भीतर इसे प्राप्त करने में सक्षम हैं तो मुझे दिलचस्पी होगी। mongo.find.exhaust गति में सुधार कैसे करेगा इस पर कोई स्पष्टीकरण पाएं। क्या आप जानते हैं कि यह वास्तव में कैसे काम करता है? – user1176316

+0

मेरी सीमित समझ यह है कि यह सभी क्वेरी मैचों की एक बार में पुनर्प्राप्ति को मजबूर करता है। अगर कर्सर.नेक्स्ट से डेटाबेस में बार-बार कॉल का ओवरहेड महत्वपूर्ण है तो यह गति में सुधार कर सकता है। मैं इसे वास्तव में इस उपयोग के मामले में मदद करने का केवल 3% मौका दूंगा, लेकिन यह एक आसान बदलाव है जो एक कोशिश के लायक है। इसका मेरा सबसे अच्छा संदर्भ है http://mongodb.github.com/node-mongodb-native/api-generated/collection.html#find – mjhm

1

मुझे सामान्य तरीके से ऐसा करने का कोई तेज़ तरीका नहीं है। आप एक विदेशी आवेदन से डेटा आयात कर रहे हैं और एक व्याख्या की गई भाषा के साथ काम कर रहे हैं और संग्रह में दस्तावेजों की संरचना की उम्मीद कर सकते हैं rmongodb कोई रास्ता नहीं है। जब आप हजारों दस्तावेजों से निपट रहे हैं तो प्रक्रिया स्वाभाविक रूप से धीमी है।

+1

धन्यवाद गेराल्ड। दस्तावेज़ mongo.find.exhaust पर प्रकाश की तरह हैं, क्या आप विस्तृत कर सकते हैं? मैंने यह विकल्प जोड़ा और आर क्रैश हो गया। – rjb101

+0

समस्या i = i + 1 के साथ हर बार संलग्न करने में है। मुझे विश्वास है कि आर हर बार डेटा संरचना की प्रतिलिपि बना रहा है, फिर इसे बदलना, जितना बड़ा हो जाता है, उतना ही खराब हो जाता है। यह एक व्याख्या की गई भाषा के साथ कुछ भी नहीं है, जैसा कि पाइथन में यह तीव्रता के आदेश तेजी से है। –