2009-03-16 7 views
7

में बड़ी डेटा संरचना को संभालें मैं जावा एप्लिकेशन पर काम कर रहा हूं जिसके लिए बहुत बड़ी मैट्रिक्स पर काम करने की आवश्यकता है। उदाहरण के लिए दो 10 मिलियन * 10 मिलियन matrices गुणा! बेशक जावा ढेर में इन मैट्रिक्स में से किसी एक को संग्रहीत करने के लिए पर्याप्त स्थान नहीं है। मुझे क्या करना चाहिए? क्या मुझे अपने मैट्रिक्स को स्टोर करने के लिए डेटाबेस का उपयोग करना चाहिए और हर आवश्यक भाग को याद रखना चाहिए और इसे किसी दूसरे के बाद गुणा करना चाहिए?जावा

+1

है किसी भी मौके से मैट्रिक्स स्पैस? – TrayMan

+0

हाँ। यह कई मामलों में हो सकता है। लेकिन हम निश्चित नहीं हो सकते हैं। – user78564

+0

आप क्या हासिल करने की कोशिश कर रहे हैं? सबसे अधिक संभावना यह करने का सही तरीका नहीं है। – starblue

उत्तर

2
+0

यह एक आरडीबी है। तुम्हारा मतलब है कि मैं इस मतलब के लिए किसी भी आरडीबी का उपयोग कर सकता हूं ... उदाहरण के लिए MySQL? क्या यह डीबी का उपयोग करने में सक्षम है? मेरा मतलब है कि कोई बेहतर समाधान है (डिस्क स्थान या ... का उपयोग कर)। – user78564

+0

मैं "एम्बेडेड" डीबी कहूंगा, क्योंकि एचएसक्यूएलडीबी शुद्ध इन-मेमोरी डेटाबेस से बहुत कुछ कर सकता है। –

+0

@ अज्ञात: हां, आरडीबी शायद इसके लिए एक अच्छा विचार है, क्योंकि यह बड़ी मात्रा में डेटा को संभालने के लिए डिज़ाइन किया गया है। आपकी सटीक जरूरतों के आधार पर, आपको अधिक विशिष्ट सॉफ़्टवेयर की आवश्यकता हो सकती है, लेकिन जो आपने लिखा है, उससे मैं एक संबंधपरक डेटाबेस का सुझाव दूंगा। –

1

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

+0

मैं देखता हूं। धन्यवाद। मुझे लगता है कि यह मेरे आवेदन के लिए काम करता है :) – user78564

+0

इन-मेमोरी डीबी का उपयोग धीमा नहीं होगा ... – Tobias

3

मैट्रिक्स गुणा की जटिलता, अगर नैतिक रूप से किया जाता है, तो ओ (एन^3) है, लेकिन अधिक कुशल एल्गोरिदम मौजूद हैं। वैसे भी 10 लाख * 10 लाख मैट्रिक्स के लिए यह बहुत लंबा समय ले रहा है और आपको एक ही ढेर प्रोबेलम का सामना करना पड़ सकता है लेकिन पुनर्संरचना के साथ।

यदि आप जटिल गणित में हैं तो आपको this article में आपकी सहायता करने के लिए टूल मिल सकता है।

2

चूंकि यह इतनी बड़ी गणना है, मुझे लगता है कि आप अपनी स्टोरेज समस्याओं के साथ प्रदर्शन समस्याओं में भागने जा रहे हैं। तो मैं इस समस्या को समानांतर करने और डेटा के सबसेट को संसाधित करने के लिए mutliple मशीन/कोर प्राप्त करने पर विचार करता हूं।

सौभाग्य से एक मैट्रिक्स गुणा समाधान स्वाभाविक रूप से विघटित हो जाएगा। लेकिन मैं ग्रिड या वितरित कंप्यूटिंग समाधान के कुछ रूपों को देख रहा हूं।

2

जो भी स्पैर मैट्रिक्स एल्गोरिदम आपके डेटा पर लागू होता है उसका उपयोग करें। (इस धारणा पर कि आपके पास 2.4 पीबी डिस्क स्पेस नहीं है, जिसमें डबल्स के 10^8 वर्ग गैर-स्पैस मैट्रिस से 3 को पकड़ने के लिए, अकेले ही इन-मेमोरी डेटाबेस के लिए बहुत रैम दें - ब्लू जीन/क्यू 'केवल' 1.6 पीबी।)

1

पर एक नज़र एक बाहरी फ़ाइल और FileChannel वस्तु के माध्यम से इसे उपयोग में अपने सभी डेटा भंडारण के द्वारा Memory Mapped File उपयोग करने का प्रयास है।

एमएमएफ के संक्षिप्त परिचय के लिए this article देखें।

8

सबसे पहले, 10 मिलियन x 10 मिलियन मैट्रिक्स बस विशाल है। प्रत्येक सेल के लिए युगल मानते हैं और कोई भंडारण ओवरहाइड नहीं होता है, इनमें से प्रत्येक चीज 800 टेराबाइट्स होने जा रही है। मुख्य स्मृति से एक बार फिर से प्रत्येक सेल को पढ़ना (क्या यह किसी भी तरह से जादुई रूप से फिट होना चाहिए, जो स्पष्ट रूप से नहीं हो रहा है), इसमें दिन लगेंगे। इसे किसी भी प्रकार के व्यावहारिक SAN से (हम इसे 10 जीबीई पर रखेंगे) से महीनों की संभावना अधिक है। और कोई मैट्रिक्स गुणा करता है ओ (एन) जटिलता - सामान्य दृष्टिकोण ओ (एन^3) हैं। तो ... आप स्मृति मैप की गई फ़ाइलों, सामान्य डेटाबेस, या उस तरह के किसी भी चीज़ के साथ ऐसा नहीं कर रहे हैं।

ऐसा कुछ करने वाला कोड कैश दक्षता पर रहने या मरने जा रहा है, जहां "कैश" में मुख्य मेमोरी, स्थानीय डिस्क ड्राइव का अच्छा उपयोग शामिल है। चूंकि एक से अधिक 800 टेराबाइट मैट्रिक्स वाले किसी स्टोरेज इंटरफ़ेस को किसी प्रकार का SAN होना चाहिए, इसलिए आप लगभग निश्चित रूप से कई सर्वरों को पढ़ने और काम करने के लिए भी शामिल हैं।

मैट्रिक्स गुणा को समानांतर करने के लिए कई प्रसिद्ध तरीके हैं (अनिवार्य रूप से विभिन्न आकार के उप-मैट्रिक्स को गुणा करें और फिर परिणामों को संयोजित करें), और लेआउट शिफ्ट करें ताकि एक्सेस पैटर्न के पास space-filling curves के डेटा को व्यवस्थित करके उचित कैश इलाके हो पंक्ति/कॉलम व्यवस्था के बजाय। आप निश्चित रूप से विशिष्ट आधुनिक हार्डवेयर को देखते BLAS कार्यों के कार्यान्वयन के रूप में, क्लासिक LAPACK इंटरफेस और डिजाइन को देखने के लिए Intel's MKL, GotoBLAS चाहते करने जा रहे हैं, और उसके बाद आप शायद बेरोज़गार क्षेत्र में venturing रहे हैं :-)

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

  • कोई संबंधित समस्या नहीं^_^