2008-10-17 22 views
11

डेटाबेस में बड़े सरणी (10000x100) को स्टोर करने का सबसे प्रभावी तरीका क्या है, कहें, hsqldb? मुझे यह एक निश्चित गणित कार्यक्रम के लिए ऐसा करने की ज़रूरत है जिसे मैं जावा में लिख रहा हूं। कृपया मदद करे। संपूर्ण सरणी को पुनर्प्राप्त और अक्सर संग्रहीत किया जाएगा (इतना व्यक्तिगत तत्व नहीं)। इसके अलावा, सरणी के बारे में कुछ मेटा-डेटा को सरणी के बारे में संग्रहीत करने की आवश्यकता है।डेटाबेस में एरे भंडारण

+0

क्या आपको सरणी तत्वों के लिए यादृच्छिक पहुंच की आवश्यकता है, या केवल सरणी के लिए? – gnud

+0

क्या आप PostgreSQL के लिए समाधान जानते हैं? – luksmir

उत्तर

15

शानदार सवाल।

जब तक आप अपने सरणी को सामान्यीकृत टेबल के सेट में अनुवाद नहीं करना चाहते हैं, जो ऐसा लगता है कि आप ऐसा नहीं करते हैं, तो आप क्रमबद्धता पर विचार करना चाहेंगे।

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

आप किस डेटा प्रकार का उपयोग कर रहे हैं, इस पर निर्भर करते हुए, आप अपने सरणी को एक्सएमएल या बाइनरी में बदल सकते हैं और फिर डेटाबेस में एक ही फ़ील्ड में सहेज सकते हैं। आप http://java.sun.com/developer/technicalArticles/Programming/serialization/ को चेक करके जावा में इस तकनीक के साथ शुरू कर सकते हैं। मुझे पता है कि यह .NET में बनाया गया है।

आशा है कि इससे मदद मिलती है। अगर मैं आपको और दिशा दे सकता हूं तो मुझे बताएं।

0

अपनी सरणी के डेटा के साथ एक तालिका को परिभाषित करें और सरणी मानों को किसी तालिका में डालें।

यह बहुत ही सरल डेटा एक्सेस/स्टोरेज है। क्या आपके सरणी आयाम हमेशा समान होंगे?

+0

नहीं, आयाम समान नहीं रहेंगे। –

+0

यदि आयाम समान नहीं हैं तो आपको नीचे उल्लेखित क्रमिकरण जैसे कुछ का उपयोग करना होगा। – Nick

+0

मैं ऐसा भी करूंगा यदि आयाम समान नहीं रहते हैं। हर समय टेबल बनाने और हटाने में कोई बात नहीं है। –

0
  • इसे एक बड़े स्पष्ट लेनदेन में करें। प्रत्येक सम्मिलन के लिए एक नया निहित लेनदेन बनाने के लिए डेटाबेस सिस्टम को मजबूर न करें।
  • तैयार कथन का उपयोग करें।
8

बीएलओबी के रूप में डेटा संग्रहीत करने और बीएलओबी को वास्तविक जावा सरणी में डीकोड करने के लिए जावा का उपयोग करने के बारे में कैसे? यह पूरे सरणी को एक गलियारे में संग्रहित करने और पुनर्प्राप्त करने के लिए और अधिक कुशल होगा, लेकिन व्यक्तिगत तत्वों को झुकाव के लिए भयानक होगा।

+0

बीएलओबी – MarlonRibunal

0

PostgreSQL में सरणी के लिए अंतर्निहित समर्थन है।

http://www.postgresql.org/docs/8.0/interactive/arrays.html

+1

जाने का तरीका है यह एक बहुत अच्छा बिंदु है (हालांकि ओपी ने कुछ अन्य डीबी निर्दिष्ट किया है, जिसमें उस संबंध में PostgreSQL की अद्भुत लचीलापन नहीं हो सकती है)। क्या आप जानते हैं कि यह कितनी कुशलतापूर्वक लागू किया गया है? मुझे लगता है कि यह बड़े सरणी के लिए नहीं है, लेकिन मैं गलत हो सकता हूं। – SquareCog

+0

क्या MySQL और MicrosoftSQL में पीएसक्यू के ARRAY प्रकार के बराबर है? – luksmir

2

एक आंतरिक प्रतिनिधित्व तैयार करें - यह एक्सएमएल, JSON, कुछ बाइनरी फ़ाइल आप अपने आप को साथ आने के लिए, या क्रमांकन के किसी अन्य रूप हो।

इसे "ब्लॉब" डेटाटाइप का उपयोग करके तालिका में स्टोर करें। अतिरिक्त कॉलम में मैट्रिक्स से जुड़े किसी मेटाडेटा को स्टोर करें।

मैं दृढ़ता से असहमत हूं कि ऐसा करने का तरीका आपकी मैट्रिक्स के समान पंक्तियों और स्तंभों के साथ एक तालिका बनाना है - यह उस कार्यक्षमता के लिए भुगतान करने के लिए बहुत अधिक कीमत है जिसका आप उपयोग नहीं करते हैं।

पहले से अपने सम्मिलित/चयन कथन तैयार करें, और आप जिस मैट्रिक्स के साथ काम कर रहे हैं उसे बदलने के लिए बाध्य चर का उपयोग करें - डीबी को प्रत्येक अनुरोध को दोबारा नहीं डालें।

1

यदि यह केवल 1 सरणी है, तो बाइनरी फ़ाइल का उपयोग क्यों न करें?

1

जैसा कि पहले से ही सुझाव दिया गया है: यदि आपको सुविधाओं की आवश्यकता नहीं है तो आरडीबीएमएस का उपयोग न करें।सीरियलाइजेशन के बजाए आप शायद निम्न स्तर एपीआई जैसे JDBM पर विचार करना चाहें जो ऑन-डिस्क इंडेक्स को प्रबंधित करने जैसी सुविधाओं जैसे कुछ डेटाबेस प्रदान करता है।

1

अपने डेटा घनी पैक किया जाता है, तो (मान हिस्टोग्राम फ्लैट लाइन के करीब है), तुम्हारा सबसे अच्छा विकल्प ब्लॉब और क्रमबद्धता वस्तु का उपयोग कर [आउटपुट/इनपुट] स्ट्रीम है।

अन्यथा, आप इसे और अधिक कुशल विरल सरणियों और इकाई-गुण-मूल्य स्कीमा की भिन्नता का उपयोग करने के मिल सकती है। यहां एक उदाहरण दिया गया है:

Name | IndexKey | Value 
------+-----------+------- 
foo | 'default' | 39   
foo | 0:0:0  | 23 
foo | 0:0:1  | 34 
foo | 1:5:0  | 12 
... 
bar | 1:3:8  | 20 
bar | 1:3:8  | 23 
bar | 1:1:1  | 24 
bar | 3:0:6  | 54 
... 

यह आपको तालिका के हिस्सों में तेजी से अपडेट करने और SQL 'जैसे' ऑपरेटर का उपयोग करके स्लाइस का चयन करने की अनुमति देता है।

यदि सूचकांक दक्षता में सुधार करने के लिए प्रत्येक आयाम के लिए int कॉलम को अलग करने के लिए कुंजी कॉलम को तोड़ने के लिए आपके आयामों की संख्या तय की गई है और अधिक लचीली चयन मानदंड हैं (आप मेटाडेटा के लिए पहली अनुक्रमणिका 'शून्य' का उपयोग कर सकते हैं डिफ़ॉल्ट मान)।

किसी भी मामले में, यह एक अच्छा विचार नाम पर एक क्लस्टर सूचकांक, IndexKey कॉलम बनाने के लिए है।

0

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

0

एचएसक्यूएलडीबी 2.0 तालिका के कॉलम के रूप में संग्रहीत एक आयामी सरणी का समर्थन करता है। तो तालिका की प्रत्येक पंक्ति 2 डी सरणी की एक पंक्ति के अनुरूप होगी।

लेकिन अगर आप एक पूरे के रूप में एक 2 डी सरणी पुनर्प्राप्त करना चाहते हैं, ब्लॉब सबसे अच्छा समाधान है।

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