2010-11-18 8 views
5

मेरे पास लगभग 500 मिलियन 128-बिट पूर्णांक हैं, जो प्रति वर्ष लगभग 100 मीटर जोड़ते हैं। कुछ भी कभी नहीं हटाया जाता है। संख्याएं एक समान वितरण, पैमाने पर और समय-समय पर आती हैं।128-बिट पूर्णांक के बड़े सेट को स्टोर करने के लिए ऑन-डिस्क संरचना?

असल में, मुझे केवल एक ऐड ऑपरेशन चाहिए जो यह भी लौटाता है कि डीबी में पहले से मौजूद नंबर मौजूद है या नहीं। इसके अलावा, मैं इस प्रणाली के लिए बहुत अधिक रैम का उपयोग नहीं करना चाहता, इसलिए बस स्मृति में सबकुछ संग्रह करना वह नहीं है जिसे मैं ढूंढ रहा हूं।

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

मैं लिनक्स पर पायथन का उपयोग कर रहा हूं, लेकिन मैं सुझावों के लिए खुला हूं।

Similar question in C++

अद्यतन: मार्सेलो की टिप्पणी का उल्लेख Bloom Filter है, जो वास्तव में मेरे लिए वादा करता है। चूंकि मैं हैश के साथ काम कर रहा हूं, इसलिए मैंने पूरी तरह से पूर्ण सटीकता को छोड़ दिया है, इसलिए यह एक महान सटीकता/प्रदर्शन व्यापार हो सकता है।

+0

आप संख्याओं के वितरण के बारे में क्या बता सकते हैं? प्रत्येक वर्ष जोड़ों के बारे में? –

+0

यह (होना चाहिए) वर्दी, संख्याएं हैंश हैं। स्थिर गति, तो प्रति सेकंड लगभग 3 जोड़ ऑपरेशन। – itsadok

उत्तर

3

सम्मिलित 2 n SQLite डेटाबेस का एक पूल में से एक में प्रत्येक पूर्णांक (2 शायद एक अच्छी संख्या में है) पूर्णांक के n -बिट हैश कंप्यूटिंग द्वारा चुना। एक तालिका का एक कॉलम प्राथमिक कुंजी बनाएं, ताकि मौजूदा नंबर डालने का प्रयास विफल हो जाए।

मानते हैं कि पूर्णांक पहले से ही यादृच्छिक हैं, आप शायद "हैश" के रूप में कम से कम महत्वपूर्ण बाइट चुन सकते हैं।

संपादित करें: मैंने कुछ परीक्षण किया है। मैंने लगभग दो घंटों में 25 मिलियन प्रविष्टियां डाली हैं, लेकिन इस प्रक्रिया में 1 जीबी से ज्यादा गड़बड़ हो गई है। यह यादृच्छिक संख्याएं उत्पन्न करके और 32 उपप्रोसेसेस को वितरित करके किया जाता है, प्रत्येक एक SQLite डेटाबेस के नियंत्रण में होता है और प्रत्येक 100,000 प्रविष्टियों में एक बार काम करता है। प्रविष्टियां वर्तमान में लगभग 1350 हर्ट्ज पर चिपक रही हैं, आपकी समस्या की मांग 3 हर्ट्ज से कहीं अधिक है, लेकिन पूरा डेटाबेस अभी भी कैश में फिट बैठता है (मेरे पास 8 जीबी रैम है)। मैं स्थिर-स्थिति प्रदर्शन को तब तक नहीं जानूंगा जब तक कि मैं आपके वर्तमान डेटाबेस आकार के करीब न जाऊं। उस बिंदु पर, प्रत्येक सम्मिलन कम से कम चार डिस्क-हेड आंदोलनों को प्रेरित करेगा (सूचकांक और तालिका को पढ़ें और लिखें, शायद बी + पेड़ में ड्रिल करने के लिए और अधिक), और फिर आपको पता चलेगा कि आप वास्तव में कितने दर्द में हैं ।

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

+0

यह वही लगता है जो मैं पहले से कर रहा हूं (एन = 4 के साथ)। MySQL पर SQLite पसंद करने का कोई कारण? मुझे संदेह है कि संख्या दो बार संग्रहीत की जाएगी - एक बार सूचकांक के लिए और एक बार "डेटा" के लिए। कोई विचार अगर यह सच है? – itsadok

+0

इसे "कोई जवाब नहीं" के रूप में स्वीकार करना। कभी-कभी ऐसा लगता है कि बी + पेड़ सभी सीएस की पेशकश कर रहे हैं ... – itsadok

+0

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

0

अपने हैंश को हश करें?

+0

मुझे यकीन नहीं है कि मैं आपका जवाब समझता हूं – itsadok

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