2011-12-06 15 views
12

मेरे पीएचपी memory_limit 64M (जो बहुत अधिक है के साथ शुरू करने के लिए)PHP और मोंगो - findOne() स्मृति थकावट का कारण बनता है

मैं एक MongoCollection :: findOne() मेरी PHP कोड में कहा जाता है, जहां मैं "एक लगता है "MongoId द्वारा। यह ज्यादातर मामलों में काम करता है। हालांकि कुछ मामलों में, यह PHP को 64 एम की स्मृति_लिमिट पर जाने का कारण बनता है।

मोंगो में डेटा रिकॉर्ड अधिकतम 3.5 एमबी है क्योंकि मोंगो 4 एमबी से अधिक की अनुमति नहीं देता है।

जब मैं getOne() को कॉल करने से पहले, memory_get_usage() चलाता हूं, तो यह केवल 4 एमबी है। तो पाते हैं एक() ने अन्य 60 एमबी + का उपभोग किया है। क्या यह एक मेमोरी रिसाव है या क्या मैं मोंगो में स्टोर करने के तरीके में एक डिज़ाइन दोष हूं?

मेरे पीएचपी मोंगो चालक नवीनतम 1.26

+0

क्या आपने MongoCollection :: findOne() को कुछ भी आपूर्ति की थी? – ajreal

+0

हां, "_id" –

+0

आपूर्ति की गई _id के लिए किस तरह का मूल्य? – ajreal

उत्तर

1

यदि आप सही कोड पोस्ट कर रहे हैं तो यह उपयोगी होगा। यह आपके कोड की सबसे अधिक संभावना है, लेकिन एक मौका है कि यह मोंगो PHP ड्राइवरों के साथ एक बग हो सकता है। ड्राइवरों का नवीनतम संस्करण (1.2.9) पिछले संस्करणों से एक कदम पीछे की ओर लगता है।मुझे खुद को ड्राइवर में एक बग मिला जो कनेक्शन टाइमआउट पर php से segfault का कारण बनता है: o एक बातचीत में जो मैंने 10gen डेवलपर के साथ किया था, मुझे यह पता चला कि PHP ड्राइवर सभी भाषाओं का कम से कम परिपक्व हैं, लेकिन मुझे बताया गया था कि उन्होंने अभी एक PHP डेवलपर को काम पर रखा है ताकि ड्राइवरों को जल्द ही कुछ प्यार मिलना चाहिए।

1

यह जानते हुए कि मोंगो सख्त हैशिंग द्वारा लग रहा है, और कहा कि किसी भी आईडी के लिए देखने अनुक्रम सीमित है, वहाँ बिल्कुल कोई रास्ता नहीं इस मोंगो के कर किया जा सकता है।

यदि आप एक मोंगोइड का उपयोग कर रहे हैं तो आपको सुनिश्चित होना चाहिए कि आईडी मान्य है। चूंकि एक मोंगोइड दिए गए रिकॉर्ड के लिए हैश हल किया गया है।

यह समस्या हो सकती है। या मैं पूरी तरह से गलत हो सकता है।

1

मुझे आपके विशिष्ट मामले के बारे में बहुत कुछ पता नहीं है; हालांकि, मेरे पास MySQL और केकफ़्पी का उपयोग करके कई बार हुआ है। मैंने कभी भी php के साथ mongo का उपयोग नहीं किया है। निम्न का प्रयास करें:

ए) क्या आपने अपने डीबी में कोई इंडेक्स सेट अप किया है?
बी) आप php.ini के माध्यम से अपनी मेमोरी सीमा बढ़ा सकते हैं, मेरा आमतौर पर लगभग 256 एमबी सेट होता है।
सी) यह मामला हो सकता है कि आपके संगठनों ने वस्तुओं का एक समूह बनाया है। मुझे संदेह है कि आपकी क्वेरी 60 एमबी भरने का कारण बन रही है, बल्कि संघों के कारण कुछ रिकर्सिव अराजकता है। अपनी क्वेरी को कॉल करने से पहले असंबद्ध एसोसिएशन का प्रयास करें।
डी) सभी संघों को बंद करें और धीरे-धीरे अपना रास्ता तैयार करें।

मुझे पता है कि मोन्गो जटिल प्रश्नों की आवश्यकता को खत्म करने के लिए माना जाता है। शायद यह एक भाषा/पुस्तकालय मुद्दा है?

आशा है कि इससे मदद मिलती है!

1

खोल से संबंधित संग्रह पर db.<your collection>.validate() आदेश का प्रयास करें।
संग्रह पर कॉल करें db.<your collection>.reIndex() पर कॉल करें।
सभी इंडेक्स को छोड़ने और उस संग्रह पर उन्हें पुन: प्रयास करने का प्रयास करें (यहां तक ​​कि सभी संग्रह; कुछ भी चोट नहीं पहुंचाएंगे)।
खोल से db.repairDatabase() आज़माएं।

इसके अलावा, अपने PHP कोड से, एक ही मानदंड को खोजने के लिए कोशिश करें() और देखें कि क्या आपको स्मृति भ्रष्टाचार मिलता है या नहीं।

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