2012-11-15 13 views
5

मेरे पास एम्बेडेड लिनक्स पर चल रहा एक एप्लिकेशन है। मेरे पास कुछ टेबल के साथ पूर्व-निर्मित डीबी है जहां प्रत्येक में बहुत सारी पंक्तियां (हजारों) और 52 कॉलम हैं। मैंने आगे डीबी बनाया, क्योंकि मुझे चिंता है कि अगर मैं रन-टाइम पर 'इंसर्ट' करूँगा तो मैं डिस्क विखंडन कर दूंगा, इसलिए इसके बजाय मैं बहुत सारे कचरे के साथ डीबी का निर्माण करता हूं 'INSERT और रन-टाइम में मैं 'अद्यतन का उपयोग करता हूं।SQLite WAL प्रदर्शन सुधार

मैं हर 3 सेकंड में डीबी में बहुत सारे डेटा लिख ​​रहा हूं, और लिखने की प्रक्रिया तेजी से होने के लिए, मैं SQLite में WAL मोड का उपयोग करता हूं। हालांकि, मुझे प्रदर्शन की समस्या है। ऐसा लगता है कि जब भी एक चेकपॉइंट होता है, यह बहुत लंबा लगता है और प्रोसेसर इसे 3 सेकंड से कम समय में नहीं कर सकता है। इसे सुधारने के लिए, मैंने एक धागा बनाया है कि 10 लेखन कॉल की तरह, इसे मुख्य धागे से और चेकपॉइंटिंग से संदेश-कतार प्राप्त होता है।

तो अब ऐसा लगता है कि स्थिति बेहतर है लेकिन डब्ल्यूएएल फ़ाइल बड़ी और बड़ी और बड़ी हो रही है ... मैं यहां कैसे काम कर सकता हूं?

उत्तर

5

विखंडन से बचने और डेटा को पूर्व-सम्मिलित करने की आवश्यकता को हटाने के लिए, आपको sqlite3_file_control()SQLITE_FCNTL_CHUNK_SIZE के साथ खंड आकार सेट करने के लिए उपयोग करना चाहिए। बड़े भाग में डेटाबेस फ़ाइल स्थान आवंटित करना (एक समय में 1 एमबी कहें), फ़ाइल-सिस्टम विखंडन को कम करना चाहिए और प्रदर्शन में सुधार करना चाहिए। मोज़िला प्रोजेक्ट currently using this setting फ़ायरफ़ॉक्स/थंडरबर्ड में great success है।

डब्ल्यूएएल के संबंध में। यदि आप अक्सर बहुत सारे डेटा लिख ​​रहे हैं, तो आपको अपने लेन-देन को बड़े लेनदेन में लपेटने पर विचार करना चाहिए। आम तौर पर, प्रत्येक आईएनएसईआरटी स्वतः प्रतिबद्ध होता है और SQLite को तब तक इंतजार करना पड़ता है जब तक कि डेटा वास्तव में डिस्क या फ्लैश पर फ़्लश नहीं हो जाता - जो स्पष्ट रूप से बहुत धीमा है। यदि आप एक लेन-देन में एकाधिक लिखते हैं, तो SQLite को प्रत्येक पंक्ति के बारे में चिंता करने की आवश्यकता नहीं होती है, और एक ही बार में कई पंक्तियों को फ्लश कर सकती है, अधिकतर एक फ्लैश लेखन में संभवतः - जो बहुत तेज है। तो, यदि आप कर सकते हैं, कम से कम कुछ सौ एक लेनदेन में लिखने की कोशिश करें।

मेरे अनुभव में, फ्लैश पर वाल वास्तव में बहुत अच्छी तरह से काम नहीं कर रहा है, और मुझे पुराने पत्रिका मोड से चिपकने के लिए और अधिक फायदेमंद लगता है। उदाहरण के लिए, एंड्रॉइड 4 अपने SQLite डेटाबेस के लिए WAL मोड का उपयोग नहीं करता है, और शायद किसी कारण से। जैसा कि आपने देखा है, वाल की कुछ परिस्थितियों में बाध्य किए बिना बढ़ने की प्रवृत्ति है (हालांकि, लेन-देन शायद ही कभी किए जाने पर भी ऐसा होगा - इसलिए एक बार में ऐसा करना सुनिश्चित करें)।

+1

ध्यान दें कि यह डेटाबेस फ़ाइल के लिए फ़ाइल स्थान के आवंटन को प्रभावित करता है। डब्ल्यूएएल फ़ाइल में आवंटन को समझने से मैं खंड आकार का सम्मान नहीं करता हूं। –

1

वाल मोड में, SQLite किसी भी बदले गए पृष्ठों को -wal फ़ाइल में लिखता है। केवल चेकपॉइंट के दौरान ये पृष्ठ डेटाबेस फ़ाइल में वापस लिखे गए हैं।

-wal फ़ाइल को केवल तभी किया जा सकता है जब कोई समवर्ती पाठक न हों।

आप वाल SQLITE_CHECKPOINT_RESTART साथ sqlite3_wal_checkpoint_v2 बुला या PRAGMA wal_checkpoint(RESTART) को क्रियान्वित करते हुए स्पष्ट रूप से फ़ाइल बाहर साफ करने की कोशिश कर सकते हैं, लेकिन अगर कोई समवर्ती पाठकों रहे हैं इस असफल हो जायेगी।

+0

यह मेरे प्रश्न का उत्तर नहीं देता .. –