2012-06-17 14 views
9

मैं एक दस्तावेज़ के भीतर एक बड़ी बाइनरी सरणी संग्रहित कर रहा हूँ। मैं लगातार इस सरणी में बाइट जोड़ना चाहता हूं और कभी-कभी मौजूदा बाइट्स के मान को बदलना चाहता हूं।Mongodb में बाइनरी डेटा को कुशलतापूर्वक स्टोर और अपडेट करने के लिए कैसे करें?

मैं कुछ $ append_bytes और $ replace_bytes प्रकार के संशोधक के लिए देख रहा था लेकिन ऐसा लगता है कि मैं सबसे अच्छा कर सकता हूं सरणी के लिए $ पुश है। ऐसा लगता है कि अगर मैं डिस्क पर अंतर्निहित बीएसओ के लिए किसी भी तरह से पहुंच गया था, तो यह खोज-लिखने के प्रकार के संचालन करने के द्वारा किया जा सकता है, लेकिन यह मुझे नहीं लगता है कि यह mongodb (और संभवतः अच्छे कारण के लिए) में ऐसा करने के लिए है।

यदि मैं सिर्फ इस बाइनरी सरणी से पूछताछ करने के लिए, इसे संपादित या जोड़ने के बजाय, और फिर पूरे क्षेत्र को फिर से लिखकर दस्तावेज़ को अद्यतन करता हूं, तो यह कितना महंगा होगा? प्रत्येक बाइनरी सरणी 1-2 एमबी के क्रम में होगी, और अपडेट हर 5 मिनट में और दस्तावेज़ों के 1000s में एक बार होते हैं। इससे भी बदतर, अभी तक इन्हें (समय में) फैलाने का कोई आसान तरीका नहीं है और वे आमतौर पर 5 मिनट के अंतराल पर एक दूसरे के करीब हो रहे हैं। क्या किसी के पास यह अच्छा अनुभव है कि यह कितना विनाशकारी होगा? ऐसा लगता है कि यह समस्याग्रस्त होगा।

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

क्या कोई अन्य विकल्प है जिसे मैं यहां देख रहा हूं?

अग्रिम में धन्यवाद।

संपादित

कुछ काम मैं बाइनरी डेटा वस्तुओं के लिए एक अलग फाइल सिस्टम का उपयोग करने का फैसला किया है मेरी उपयोग के मामलों के लिए कुछ परीक्षण (विशेष रूप से या तो pytables या h5py का उपयोग कर HDF5) लिखने के बाद। मैं अभी भी इन बाइनरी डेटा ऑब्जेक्ट्स के दृढ़ता को छोड़कर सब कुछ के लिए मोंगो का उपयोग करूंगा। इस तरह से मैं अपने बेस मोंगो प्रदर्शन से दूर ऑपरेशन को जोड़ने और अपडेट करने के लिए संबंधित प्रदर्शन को रद्द कर सकता हूं।

मोंगो डेवलपर्स में से एक ने इंगित किया कि मैं डॉट नोटेशन और $ सेट (नीचे टिप्पणी में रेफरी देखें) का उपयोग करके आंतरिक सरणी तत्व सेट कर सकता हूं, लेकिन इस समय कोई सरणी में सेट सेट करने का कोई तरीका नहीं है atomically।

इसके अलावा - अगर मेरे पास मेरे मोंगो दस्तावेजों के भीतर 2 एमबी बाइनरी डेटा फ़ील्ड हैं और मैं उन्हें अद्यतन और बढ़ रहा हूं (जैसे प्रत्येक 5 मिनट में कम से कम एक बार) - मेरा आंत मुझे बताता है कि मोंगो को डिस्क पर अपनी फ़ाइल (फाइलों) के भीतर बहुत सारे आवंटन/विकास के मुद्दों का प्रबंधन करें - और अंत में यह प्रदर्शन समस्याओं का कारण बन जाएगा। मैं ओएस स्तर पर एक अलग फाइल सिस्टम को संभालने के लिए लोड करना बंद कर दूंगा।

अंत में - मैं अपने डेटा पर नम्रता का उपयोग करके गणना और प्रदर्शन कर रहा हूं - दोनों pytables और h5py मॉड्यूल numpy व्यवहार और दुकान के बीच अच्छा एकीकरण की अनुमति देते हैं।

+0

लिए यह सिर्फ है कि आप $ डॉट नोटेशन के साथ सेट का उपयोग करने वाले सरणी तत्वों का उपयोग कर सकते MongoDB विकासक के द्वारा मेरे ध्यान में लाया गया था। मैंने इसे अनदेखा किया। रेफरी यहां है: http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29#DotNotation%28ReachingintoObjects%29-ArrayElementbyPosition – Rocketman

उत्तर

4

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

When to use GridFS उपयोगी हो सकता है आप

+1

मैंने ग्रिडएफएस में देखा ...फ़ाइलों को संग्रह में डाल दिया जाता है और यह स्वचालित रूप से हिस्सों में वितरण का ख्याल रखता है। यह भी प्रकट हुआ कि अगर मुझे कुछ बदलने की ज़रूरत है - तो मुझे फिर से() फिर से रखना होगा - जो भागों का एक और पूरा सेट बचाता है। ऐसा लगता है कि वर्जनिंग फाइलों के लिए बनाया गया है जो अक्सर बदलते नहीं हैं। तो मेरे मामले में मेरे पास फाइल की बड़ी संख्या में प्रतियां होंगी। जब तक कि यह किसी भी तरह से भिन्नता से परिवर्तनों को संग्रहीत नहीं करता है - लेकिन मैंने जो भी दस्तावेज देखा है, उसे भी सुझाव दिया गया है ... – Rocketman

+0

हाँ, वास्तव में मौजूदा चक्स अपडेट करना असहनीय सिरदर्द होगा। इसके बजाए, आम तौर पर आप इस पैटर्न का पालन करना चाहते हैं: 1.) पुराना खोजें, _id 2.) नया एक जोड़ें 3.) _id –

+0

द्वारा पुराने को हटाएं http://stackoverflow.com/questions/6280186/ऐपेंड-डेटा-टू-मौजूदा-ग्रिडफ्स-फ़ाइल, इस पर एक नज़र डालें –

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

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