2009-11-07 16 views
5

मैं डेटाबेस डेटा पर एक बड़े डेटासेट के लिए कोर डेटा को कैश के रूप में उपयोग करना चाहता हूं। सभी डेटा स्मृति में नहीं होंगे।इन-मेमोरी स्टोर के साथ कोर डेटा

जब यह आगे 2 सवालों के बारे में सोच मन के लिए आया था:

  1. (1-एन संबंधों के लिए उदाहरण के लिए) में स्मृति लगातार स्टोर के साथ इस्तेमाल किया जा, और यदि ऐसा है तो दोषयुक्त, आप कैसे कर सकते हैं एक गलती फायरिंग पकड़ो?

  2. एक कोर डेटा प्रबंधित ऑब्जेक्ट संदर्भ में एक स्थिरता अंतराल है। क्या यह एक इन-मेमोरी स्टोर पर भी लागू होता है?

या मुझे इस उद्देश्य के लिए एनएसएटॉमिकस्टोर का उपयोग करना चाहिए?

+0

लगभग लगता है कि आप वास्तव में क्या करना चाहते हैं, अपनी खुद की स्टोरेज परत लागू करें: प्रबंधित ऑब्जेक्ट्स जो आपके डेटाबेस सर्वर पर एक सतत स्टोर पर वापस आती हैं। –

+0

हां, लेकिन ऐसा करने का एकमात्र तरीका एनएसएटॉमिकस्टोर (मैक ओएस एक्स 10.5+ में) है और फिर आपको एक बार AFAIK में सबकुछ लोड करना होगा। – diederikh

उत्तर

11

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

आपके दूसरे प्रश्न के जवाब में, उत्तर हाँ है। स्थिरता अंतराल संदर्भ पर लागू होता है, न कि लगातार स्टोर के लिए।

तो, कोर डेटा एक दूरस्थ डेटाबेस सर्वर से डेटा कैशिंग के लिए उपयुक्त है? ज़रुरी नहीं। हालांकि बिल बमगर्नर (एक ऐप्पल इंजीनियर) ने संकेत दिया है कि यह संभव है, मुझे कोर डेटा ऑब्जेक्ट ग्राफ़ प्रबंधन से कैशिंग को अलग करने के लिए अपने कोड में यह बहुत आसान पाया गया है। किसी ऑब्जेक्ट ग्राफ़ को प्रबंधित करने के लिए कोर नियंत्रक का उपयोग करना और कंट्रोलर/UI परतों को बाध्य करने में आसानी के लिए अभी भी बहुत अच्छा है। तो मेरी रणनीति डेटाबेस सर्वर से डेटा खींचती है और इसे अपने स्वयं के डेटा संरचना में कैश करती है (ओएस एक्स 10.6 में libcache और NSCache एक बहुत अच्छा प्रारंभिक बिंदु बना सकता है)। फिर तय करें कि आप अपने ऑब्जेक्ट ग्राफ़ में क्या चाहते हैं और उसे कोर डेटा स्टैक में माइग्रेट करें (इन-मेमोरी लगातार स्टोर द्वारा समर्थित)। आपको डेटाबेस सर्वर से परिवर्तन अधिसूचना या मतदान को संभालना होगा। जब डेटाबेस से डेटा बदलता है (या उपयोगकर्ता क्वेरी में परिवर्तन इत्यादि), तो मैं बस सभी संपादकों को संपादन को समाप्त करने के लिए कहता हूं, फिर संदर्भ को मिटा दें और इसे (संभवतः) अद्यतन कैश से पुनर्निर्माण करें।

+0

आप सही हैं, मैंने कुछ कारणों से सोचा था कि इन-मेमोरी स्टोर संदर्भों के साथ अलग-अलग सोचता है (ऑब्जेक्ट को स्मृति में दो बार रोकने के लिए)। लेकिन यह निश्चित रूप से मामला नहीं है। मैंने दृढ़ता स्टोर समन्वयक के कैश में सामान लोड करने के लिए एनएसएटीओमिकस्टोर पर भी एक नज़र डाली। मेरी समस्या यह है कि मेरे पास वस्तुओं की स्थिरता को नियंत्रित करने का कोई तरीका नहीं है (मैं कैश में पूरा डेटाबेस लोड नहीं करना चाहता)। मैं स्क्लाइट स्टोर के समान व्यवहार को कम करना चाहता हूं। एनएससीएच के साथ मैं देख सकता हूं कि आप कैश पाप की अधिकतम संख्या की सीमा निर्धारित करते हैं। यह अच्छा है। – diederikh

+0

@barrywark, आपके उत्तर के अनुसार, क्या मैं बुलेट 2 "स्क्रैच कोर डेटा स्टैक को सही करता हूं जिसमें आप कोर डेटा के ऑब्जेक्ट ग्राफ़ प्रबंधन का उपयोग डिस्क पर कुछ भी जारी रखने के बिना करना चाहते हैं" का अर्थ है "यदि आप कोर डेटा स्टैक को स्टोर करना चाहते हैं डिस्क या भंडारण की अनुपलब्धता के मामले में डिस्क पर सहेजने से पहले स्मृति "? इसलिए, कुछ मामलों में, यदि मैं डेटा को स्मृति में संग्रहीत करना चाहता हूं (क्योंकि डिस्क अनुपलब्ध है), तो मैं डेटा को स्मृति में संग्रहीत कर सकता हूं। – gaussblurinc

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