मैं तुम्हें गणितीय संदर्भ से विरल मैट्रिक्स की सोच रहे हैं यह सोचते कर रहा हूँ बहुत से ई: http://en.wikipedia.org/wiki/Sparse_matrix (भंडारण तकनीकों का वर्णन वहाँ स्मृति भंडारण (तेजी से गणित आपरेशन), नहीं स्थायी भंडारण (कम डिस्क उपयोग के लिए कर रहे हैं)।
चूंकि आमतौर पर सर्वर पक्ष की बजाय क्लाइंट साइड पर इस मैट्रिक्स पर एक एसक्यूएल-एआरआरई [] सबसे अच्छा विकल्प है!
प्रश्न यह है कि मैट्रिक्स की स्पैरिटी का लाभ कैसे लें? यहां कुछ जांच से परिणाम।
सेटअप:
- Postgres 8.4
- मैट्रिसेस w/डबल परिशुद्धता में 400 * 400 तत्वों (8 बाइट्स) - मैट्रिक्स
- 33% गैर शून्य तत्व प्रति> 1.28MiB कच्चे आकार - -> 427kiB मैट्रिक्स प्रति प्रभावी आकार
- का उपयोग कर औसत निकाला ~ 1000 विभिन्न यादृच्छिक आबादी वाले मैट्रिक्स
प्रतिस्पर्धा तरीके:
- स्वत: सर्वर साइड सेट भंडारण मुख्य या विस्तारित साथ स्तंभों के संपीड़न पर निर्भर हैं।
- केवल गैर-शून्य तत्वों के साथ-साथ बिटमैप (
bit varying(xx)
) बताएं कि मैट्रिक्स में गैर-शून्य तत्वों को कहां खोजें। (एक डबल परिशुद्धता एक बिट से 64 गुना बड़ा है। सिद्धांत रूप में (ओवरहेड्स को अनदेखा कर रहा है) < = 98% गैर-शून्य ;-) हैं।) सर्वर साइड संपीड़न सक्रिय है।
- मैट्रिक्स में शून्य के साथ शून्य बदलें। (आरडीबीएमएस एनयूएलएस भंडारण में बहुत प्रभावी हैं।) सर्वर साइड संपीड़न सक्रिय है।
(एक 2 सूचकांक सरणी [] है बहुत आशाजनक नहीं और वजह परीक्षण नहीं का उपयोग कर गैर शून्य तत्वों का अनुक्रमण।)
परिणाम:
- स्वत: संपीड़न
- कोई अतिरिक्त कार्यान्वयन प्रयास
- कोई नेटवर्क ट्रैफ़िक कम नहीं किया
- न्यूनतम संपीड़न भूमि के ऊपर
- स्थायी भंडारण = 39 कच्चे आकार का%
- बिटमैप
- स्वीकार्य कार्यान्वयन प्रयास
- नेटवर्क यातायात थोड़ा कम किया है; विरलता पर निर्भर
- स्थायी भंडारण = कच्चे आकार की 33.9%
- NULLs साथ शून्य बदलें
- कुछ कार्यान्वयन प्रयास (एपीआई को पता है कहाँ और कैसे में NULLs सेट करने की जरूरत है ARRAY [] जबकि सम्मिलित करें क्वेरी)
- नेटवर्क यातायात
- स्थायी भंडारण = 35 वीं की% में कोई परिवर्तन का निर्माण ई कच्चे आकार
निष्कर्ष: बढ़ाया/मुख्य भंडारण पैरामीटर के साथ शुरू करो। यदि आपके पास कुछ समय खाली है तो अपने डेटा की जांच करें और अपने स्पेयरिटी स्तर के साथ अपने परीक्षण सेटअप का उपयोग करें। लेकिन प्रभाव अपेक्षा से कम हो सकता है।
मैं हमेशा मैट्रिक्स क्रमशः (उदाहरण के लिए पंक्ति-प्रमुख आदेश) और मैट्रिक्स आयाम NxM के लिए दो पूर्णांक कॉलम का उपयोग करने का सुझाव देता हूं। चूंकि अधिकांश एपीआई टेक्स्टुअल एसक्यूएल का उपयोग करते हैं, इसलिए आप नेस्टेड के लिए बहुत सारे नेटवर्क ट्रैफिक और क्लाइंट मेमोरी को सहेज रहे हैं "ARRAY [ARRAY [..], ARRAY [..], ARRAY [..], ARRAY [..], ..]" !!!
Tebas
CREATE TABLE _testschema.matrix_dense
(
matdata double precision[]
);
ALTER TABLE _testschema.matrix_dense ALTER COLUMN matdata SET STORAGE EXTERN;
CREATE TABLE _testschema.matrix_sparse_autocompressed
(
matdata double precision[]
);
CREATE TABLE _testschema.matrix_sparse_bitmap
(
matdata double precision[]
bitmap bit varying(8000000)
);
सम्मिलित सभी तालिकाओं में एक ही मैट्रिक्स। ठोस डेटा कुछ तालिका पर निर्भर करता है। अप्रयुक्त लेकिन आवंटित पृष्ठों के कारण सर्वर पक्ष पर डेटा को न बदलें। या एक वैक्यूम करो।
SELECT
pg_total_relation_size('_testschema.matrix_dense') AS dense,
pg_total_relation_size('_testschema.matrix_sparse_autocompressed') AS autocompressed,
pg_total_relation_size('_testschema.matrix_sparse_bitmap') AS bitmap;
इसके अलावा आप फीचरनाम VARCHAR के रूप में एक 'फीचर' प्रकार बना सकते हैं, फीचरव्यू वर्चर (या जो भी मूल्य होना चाहिए) और अपनी प्राथमिक तालिका में फीचर फ़ीचर [] फ़ीचर फ़ील्ड जोड़ें। – MkV
आप ईएवी को "एंटी-पैटर्न" क्यों कहते हैं? गुगलिंग से पता चलता है कि यह ईएवी का एक आम वर्णन है (आमतौर पर अपमानजनक रूप से उपयोग किया जाता है), लेकिन कोई भी क्यों समझाता है। ऐसे कई वैध मामले प्रतीत होते हैं जहां डेटाबेस को चिकित्सा क्षेत्र जैसे स्पैस डेटा स्टोर करने की आवश्यकता होती है, जिससे ईएवी एक उपयुक्त "पैटर्न" बनाते हैं। – Cerin
यह डेटाबेस, पंक्ति स्तर की बाधाओं और संदर्भित अखंडता के सभी फायदे दूर करता है और एक इकाई के लिए एक पंक्ति को वापस करना मुश्किल बनाता है। – MkV