2009-04-21 7 views
5

मैं अपने arm9 एम्बेडेड लिनक्स प्लेटफ़ॉर्म में स्क्लाइट डेटाबेस का उपयोग कर रहा हूं। मैं डिस्क डेटाबेस में लिखना कम करना चाहता हूं क्योंकि मेरी डिस्क एक फ्लैश मेमोरी है और इसे न्यूनतम लिखने के चक्र की आवश्यकता है। तो मैंने SQL000E_FAFAULT_CACHE_SIZE को 5000 के रूप में बढ़ाने की कोशिश की। मेरा उद्देश्य कैश में डेटा लिखना था और जब कैश भर जाता है, तो स्वचालित रूप से डिस्क पर फ्लश होता है। लेकिन SQLITE_DEFAULT_CACHE_SIZE को बढ़ाकर, मैं पुष्टि नहीं कर सकता कि यह काम कर रहा है या नहीं। मुझे ऑपरेशन में कोई बदलाव नहीं दिख रहा है! क्या मेरा रास्ता सही है? क्या कोई मुझे कुछ सुझाव दे सकता है? धन्यवाद अनीशडिस्क पर डेटाबेस फ़्लशिंग को सीमित कैसे करें?

+0

मुझे यकीन नहीं है कि मैं आपकी आवश्यकता को समझता हूं या नहीं। आम तौर पर लेनदेन की गारंटी सुनिश्चित करने के लिए डेटाबेस का उपयोग किया जाता है। ऐसा करने के लिए डेटाबेस को डिस्क पर लिखने की आवश्यकता है। यदि आपके पास राज्य परिवर्तन हैं जो महत्वपूर्ण नहीं हैं तो आप डेटाबेस को अपडेट करने के लिए परेशान क्यों हैं? आप केवल राज्य में स्मृति को बदल सकते हैं और केवल तभी डेटाबेस अपडेट कर सकते हैं जब आपको अपने परिवर्तनों को जारी रखना होगा। उस स्थिति में डिस्क को मारना डिजाइन द्वारा अपरिहार्य है, – lothar

+1

आमतौर पर हमेशा इसका मतलब नहीं है। एक अस्थायी भंडारण तंत्र के रूप में कई विदेशी वातावरण में स्क्लाइट का उपयोग किया जाता है। एक फोन पर रिमोट डेटा के कैश, उदाहरण के लिए - यदि कैश दूर हो जाता है, तो इसे हमेशा पुनर्निर्मित किया जा सकता है, यह धीमा है। उस स्थिति में, मैं इसे तेज़ होना चाहता हूं, और मैं जानना चाहता हूं कि यह दूषित है या नहीं। लेकिन भ्रष्टाचार ठीक है, जब तक मुझे पता है कि मेरा स्टोर अमान्य है। मैं इसे कभी-कभी फेंक सकता हूं। –

उत्तर

2

नवीनतम SQLite has a feature for backing up hot databases यह अभी भी प्रयोगात्मक है, लेकिन मेरी सिफारिश मेमोरी डाटाबेस पर एक का उपयोग करें और डिस्क डेटाबेस के साथ मर्ज जब आपको लगता है उचित है करने के लिए किया जाएगा।

+0

हां रॉबर्ट आप सही हैं, लेकिन समस्या यह है कि मुझे समय-समय पर डेटाबेस को फ्लश करना होगा, जो कि बहुत जोखिम भरा प्रतीत होता है। मेरा इरादा यह है कि क्या स्क्लाइट कैश पर आधारित किसी भी प्रकार की डिफ़ॉल्ट फ्लशिंग का समर्थन कर रहा है? मैं स्थापित करने PRAGMA journal_mode = स्मृति से कुछ उपरोक्त परिदृश्य के आधार पर प्रयोगों किया है, PRAGMA SQLITE_DEFAULT_CACHE_SIZE = 5000 और PRAGMA तुल्यकालिक = पूर्ण, लेकिन फ्लशिंग दर कैश और 2000 (डिफ़ॉल्ट) के आकार 5000.this पर समान प्रतीत हो रहा है मुझे आश्चर्य है। कृपया मदद करें? –

+0

दुर्भाग्य से वे विकल्प उस दर को प्रभावित नहीं करेंगे जिस पर यह ड्राइव –

+0

आपके वालबल सुझावों के लिए सबसे पहले धन्यवाद, आप यह कह रहे हैं कि, कैश पूर्ण को राम से डेटा को फ़्लश करने के मानदंड के रूप में उपयोग नहीं किया जा सकता डिस्क फ़ाइल? यदि यह है, तो मेरी समस्या किसी भी जोखिम कारक के साथ हल हो सकती है। क्या आपके पास सुझाव देने का कोई अन्य विकल्प है? उन्नत धन्यवाद, अनेश –

-1

आप SQLite के लिए स्रोत कोड है - क्यों नहीं बस साधन यह जानकारी आप में रुचि रखते हैं रिकॉर्ड करने के लिए

+0

हाँ ... यह इतना आसान है! – tylerl

+0

कृपया विस्तृत करें, मैं आपके सुझाव को समझ नहीं पाया !!!! –

+0

एमएमएम, यह उत्तर पूरी तरह से असंबंधित है जहां तक ​​मैं समझता हूं ... –

0

ठीक नील है.अगर पर "SQLite लिखने के माध्यम से कैशिंग के एक फार्म का उपयोग कर रहा" तो। कैश ओवरफ़्लो, यह डेटा को कुछ अस्थायी फ़ाइल या डिस्क फ़ाइल में फ़्लश करने का प्रयास करेगा। यह वही बिंदु है जिसे मैं कैश आकार को बढ़ाकर प्रयोग करने की कोशिश कर रहा हूं और इस प्रकार फ्लशिंग दर पर नियंत्रण प्राप्त कर रहा हूं। लेकिन यह नहीं हो रहा है। कृपया उत्तर दें ।

+0

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

2

एसक्यूएलएट प्रत्येक प्रतिबद्धता के साथ एसीआईडी ​​डीबी फ्लश होने के लिए या प्रत्येक सम्मिलित/हटा/अपडेट लेनदेन के साथ लपेटा नहीं है। समूह संचालन के लिए लेनदेन का उपयोग करें या एसिडिटी बंद करें और PRAGMA सिंक्रोनस = OFF सेट करें।

"PRAGMA तुल्यकालिक = बंद" और SQLite सब पर फ्लश डेटा (प्रभावी रूप से छोड़ने कि ओएस कैश करने के लिए) नहीं होगा

SQLITE_DEFAULT_CACHE_SIZE केवल कैश का आकार के लिए है। और कैश का उपयोग केवल डेटा पढ़ने के लिए किया जाता है।

एक और विकल्प है - आप स्वयं के वीएफएस परत को कार्यान्वित कर सकते हैं और अपने स्वयं के बफर भरने से पहले पृष्ठ की बचत को रोक सकते हैं। http://www.sqlite.org/c3ref/vfs.html

लेकिन मुझे यकीन है कि सिंक = ऑफ (या लेनदेन का उपयोग करने के लिए बहुत बेहतर) पर्याप्त काम करेगा (जब बिजली विफलताओं या सिंक = ऑफ के लिए हार्ड रीसेट के मामले में आपके डीबी को दूषित करने का अच्छा मौका है) ।

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

+0

मैं सहमत हूं; लेनदेन संरचना संभवत: सबसे बड़ा लाभ पाया जा सकता है। –

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