2010-09-29 11 views
6

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

यहाँ डेटा के बारे में कुछ जानकारी है: - क्रम में हिस्सा आती हैं - - यह 512 बाइट हिस्सा में आता हिस्सा फीफो आदेश में हटा दिया जाएगा - अगर मैं बिजली की विफलता की वजह से अंत ठीक है कि बंद कुछ डेटा खो जब तक पूरा डीबी टूटा नहीं जाता है

प्रलेखन का एक समूह पढ़ने के बाद ऐसा लगता है कि एक क्यूई डीबी बिल्कुल वही था जो मैं चाहता था।

हालांकि, कुछ परीक्षण कोड की कोशिश करने के बाद मेरे सबसे तेज़ परिणाम लगभग 1 एमबीटीई प्रति सेकेंड थे, बस डीबी-> डीबी_एपीपीएनडी सेट के साथ डालें। मैंने लेन-देन और थोक रखरखाव का उपयोग करने की भी कोशिश की लेकिन इन दोनों धीमी चीजों को काफी नीचे गिरा दिया, इसलिए मैंने उन्हें अधिक समय तक नहीं चलाया। मैं अपने Freescale i.MX35 dev बोर्ड पर NANDFlash चिप पर बनाए गए ताजा डीबी में डालने वाला था।

चूंकि हम कम से कम 2 एमबीईटी प्रति सेकंड लिखने की गति प्राप्त करने के लिए देख रहे हैं, इसलिए मैं सोच रहा था कि अगर कुछ ऐसा हुआ जो मुझे याद आया तो मेरी गति में सुधार हो सकता है क्योंकि मुझे पता है कि मेरा हार्डवेयर इससे तेज लिख सकता है।

उत्तर

8

अपने DB_CONFIG में इस डाल प्रयास करें:

set_flags DB_TXN_WRITE_NOSYNC 
set_flags DB_TXN_NOSYNC 

मेरे अनुभव से, इन वृद्धि लिखने प्रदर्शन एक बहुत।


DB_TXN_NOSYNC यदि इसे सेट बर्कले DB नहीं लिखेगा या तुल्यकालिक लॉग लेन-देन पर प्रतिबद्ध या तैयार फ्लश। इसका मतलब है कि लेनदेन एसीआई (परमाणुता, स्थिरता, और अलगाव) गुण प्रदर्शित करते हैं, लेकिन डी (स्थायित्व) नहीं; यानी, डेटाबेस अखंडता को बनाए रखा जाएगा, लेकिन यदि एप्लिकेशन या सिस्टम विफल रहता है, तो संभव है कि हाल ही में किए गए कुछ लेन-देन वसूली के दौरान पूर्ववत किए जा सकें। जोखिम पर लेन-देन की संख्या लॉग बफर में कितने लॉग अपडेट फिट हो सकती है, कितनी बार ऑपरेटिंग सिस्टम डिस्क पर गंदे बफर को फ्लश करता है, और कितनी बार लॉग चेक किया जाता है डीबी_एएनवी-> set_flags को DB_TXN_NOSYNC ध्वज के साथ केवल प्रभावित करता है निर्दिष्ट डीबी_एनवी संभाल (और किसी भी अन्य बर्कले डीबी हैंडल उस हैंडल के दायरे में खोले गए हैं)। पर्यावरण भर में लगातार व्यवहार के लिए, पर्यावरण में खोले गए सभी डीबी_एनवी हैंडल को या तो DB_TXN_NOSYNC ध्वज सेट करना होगा या ध्वज को DB_CONFIG कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट किया जाना चाहिए।

डीबी_TXN_NOSYNC ध्वज का उपयोग आवेदन के जीवन के दौरान किसी भी समय बर्कले डीबी को कॉन्फ़िगर करने के लिए किया जा सकता है।


DB_TXN_WRITE_NOSYNC तो सेट, बर्कले DB लिखेंगे, लेकिन तुल्यकालिक फ्लश नहीं होगा, लेन-देन पर लॉग प्रतिबद्ध या तैयार करते हैं। इसका मतलब है कि लेनदेन एसीआई (परमाणुता, स्थिरता, और अलगाव) गुण प्रदर्शित करते हैं, लेकिन डी (स्थायित्व) नहीं; यानी, डेटाबेस अखंडता बनाए रखा जाएगा, लेकिन अगर सिस्टम विफल रहता है, तो यह संभव है कि हाल ही में किए गए कुछ लेन-देन वसूली के दौरान पूर्ववत किए जा सकें। जोखिम पर लेनदेन की संख्या इस बात से शासित होती है कि कितनी बार सिस्टम डिस्क पर गंदे बफर को फ्लश करता है और कितनी बार लॉग चेक किया जाता है। कॉलिंग DB_ENV-> DB_TXN_WRITE_NOSYNC ध्वज के साथ set_flags केवल निर्दिष्ट DB_ENV हैंडल को प्रभावित करता है (और उस संभाल के दायरे में खोले गए किसी भी अन्य बर्कले डीबी हैंडल)।पर्यावरण भर में लगातार व्यवहार के लिए, पर्यावरण में खोले गए सभी डीबी_एनवी हैंडल को या तो DB_TXN_WRITE_NOSYNC ध्वज सेट करना होगा या ध्वज को DB_CONFIG कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट किया जाना चाहिए।

डीबी_TXN_WRITE_NOSYNC ध्वज का उपयोग आवेदन के जीवन के दौरान किसी भी समय बर्कले डीबी को कॉन्फ़िगर करने के लिए किया जा सकता है।

अधिक जानकारी के लिए http://www.mathematik.uni-ulm.de/help/BerkeleyDB/api_c/env_set_flags.html देखें।

+0

टिप्पणी के लिए धन्यवाद। हालांकि, मुझे पता चला है कि पर्यावरण को सक्षम करने से एक का उपयोग न करने की तुलना में प्रदर्शन में कमी आती है। मुझे लगता है कि इसे वाल के साथ करना है, इसलिए ये झंडे मेरी मदद करेंगे, लेकिन पर्यावरण के बिना भी सबकुछ धीमा है। – jjfine

+0

@jjfine: मेरा मानना ​​है कि अगर आप स्पष्ट रूप से ऐसा नहीं करते हैं तो पर्यावरण को अज्ञात (ऑटो-प्रतिबद्ध) लेनदेन के साथ पूरी तरह से उपयोग किया जाता है। तो पर्यावरण का उपयोग नहीं करने में मदद मिलेगी। –

+0

@VladLazarenko, इसलिए अगर मैं इन 2 झंडे में से एक सेट करता हूं, जब मैं बर्कले डीबी बंद करता हूं, तो क्या कैश डिस्क पर वापस फिसल जाएगा? – Alcott

1

मेरा सुझाव है कि आपको लेन-देन/टीडीएस डेटास्टोर का उपयोग करना चाहिए यदि आप उल्लेख करते हैं कि आप डेटाबेस को फिर से नहीं बना सकते हैं (यानी यह केवल स्थानीय कैश नहीं है) यदि यह दूषित हो जाता है। यदि आप क्रैश/पावर आउटेज की स्थिति में कुछ आइटम खोने की परवाह नहीं करते हैं तो DB_TXN_WRITE_NOSYNC टीडीएस प्रदर्शन में सुधार करेगा, तो डेटाबेस अभी भी अभिन्न और पुनर्प्राप्त करने योग्य होगा। यदि आप बीटीआरई और एक न्यूमेरिक इंडेक्स (यदि आपके पास कोई प्राकृतिक कुंजी नहीं है) का उपयोग करके स्टोर करें और एंडियन मुद्दों के लिए देखें तो आपको अच्छी कुंजी इलाके और उच्च पृष्ठ उपयोग मिल जाएगा, तो आपको 2000 से अधिक प्रविष्टियों को एक दूसरे से प्राप्त करने में सक्षम होना चाहिए, खासकर एसएसडी के लिए, विशेष रूप से यदि आप थोक आवेषण करने के लिए DbMultileKeyDataBuilder का उपयोग करते हैं।