2010-03-26 15 views
9

से निपटने के साथ मैं ब्लॉब छवियों को संग्रहित कॉलम के साथ एक बड़े बड़े MySQL डेटाबेस (कई मिलियन पंक्तियों) के साथ काम कर रहा हूं। एप्लिकेशन छवियों का एक सबसेट पकड़ने का प्रयास करता है और उन पर कुछ प्रसंस्करण एल्गोरिदम चलाता है। जिस समस्या में मैं चल रहा हूं वह यह है कि, मेरे पास बड़े डेटासेट के कारण, डेटासेट जो मेरी क्वेरी लौट रहा है वह मेमोरी में स्टोर करने के लिए बहुत बड़ा है।विशाल एसक्यूएल परिणामसेट

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

मेरा अगला विचार मूल क्वेरी को 10,000 परिणामों तक सीमित करना है, और फिर 10,000 पंक्तियों के स्पैन पर पूछताछ करना है। यह दो दृष्टिकोणों के बीच सड़क समझौता के बीच की तरह लगता है। मुझे लगता है कि शायद एक बेहतर समाधान है जिसे मुझे पता नहीं है। क्या एक समय में स्मृति में एक विशाल परिणाम के भाग का एक और तरीका है?

चीयर्स,

डेव McClelland

+0

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

+0

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

उत्तर

3

एक विकल्प डेटा रीडर का उपयोग करना है। यह डेटा स्ट्रीम करता है, लेकिन यह डेटाबेस के लिए एक खुला कनेक्शन रखने की कीमत पर है। यदि आप कई मिलियन पंक्तियों से अधिक सक्रिय हो रहे हैं और प्रत्येक के लिए प्रसंस्करण कर रहे हैं, तो यह वांछनीय नहीं हो सकता है।

मुझे लगता है कि आप भाग में डेटा को हथियाने के सही रास्ते पर जा रहे हैं, शायद MySQL की सीमा विधि का उपयोग कर सही है?

+0

हां, मैंने एसक्यूएल की सीमा का उपयोग करने की योजना बनाई थी। –

+0

इसके अलावा, मैं पहले से ही डेटा स्टोर करने के लिए डेटा रीडर का उपयोग कर रहा हूं (OdbcCommand.ExecuteReader() का उपयोग करके, फिर (datareader.Read()) के साथ फिर से चल रहा है। ऐसा लगता है कि यह बहुत प्रभावी ढंग से स्ट्रीम नहीं कर रहा है क्योंकि यह अभी भी सभी उपलब्ध सिस्टम मेमोरी को भर रहा है क्या डाटाएडर का उपयोग है जो मुझे पता नहीं है? –

+0

@ डेव, कोई और डेटाचर के विशिष्ट स्मृति उपयोग पर अंतर्दृष्टि प्रदान करने में सक्षम हो सकता है, लेकिन मेरी समझ यह है कि इसमें स्मृति में केवल एक रिकॉर्ड होना चाहिए किसी दिए गए समय पर। किसी भी दर पर, इसे डेटासेट या डेटाटेबल की तुलना में बहुत कम मेमोरी संसाधनों की आवश्यकता होनी चाहिए। आपके द्वारा पुनर्प्राप्त करने के बाद डेटा के साथ आप जो कर रहे हैं, उसकी याददाश्त समस्या हो सकती है, आप कितने समय तक हैं उन वस्तुओं को दायरे में रखते हुए, इत्यादि। –

1

जब इस तरह के बड़े डेटासेट के साथ काम कर यह यह सब स्मृति में एक ही बार में की जरूरत के लिए नहीं महत्वपूर्ण है। यदि आप डिस्क या वेबपृष्ठ पर परिणाम लिख रहे हैं, तो जैसा कि आप प्रत्येक पंक्ति में पढ़ते हैं। लिखने से पहले जब तक आप सभी पंक्तियों को पढ़ नहीं लेते तब तक प्रतीक्षा न करें।

आप छवियों को DelayLoad = true पर भी सेट कर सकते थे ताकि उन्हें केवल इस कार्यक्षमता को लागू करने के बजाय उन्हें आवश्यकता हो। अधिक जानकारी के लिए here देखें।

+0

मुझे उल्लेख करना चाहिए था, मैं (वर्तमान में) ADO.NET का उपयोग कर रहा हूं। क्या DelayLoad के बराबर है? मैं लिंक पर माइग्रेट कर सकता था, लेकिन पसंद नहीं करता। मैं प्रश्न टैग अपडेट करूंगा। इसके अलावा, मैं कहीं भी परिणाम नहीं लिख रहा हूं। मैं परिणामों में कुछ छवि विश्लेषण एल्गोरिदम चला रहा हूं ताकि इसे फ़ंक्शन में पारित छवि से तुलना कर सकें। नतीजतन, मुझे केवल सर्वोत्तम छवि को स्टोर करने की आवश्यकता है और बाकी को अनदेखा कर सकते हैं। त्वरित उत्तर के लिए धन्यवाद! –

0

मुझे 2 विकल्प दिखाई देते हैं।

1) यदि यह एक विंडोज ऐप है (एक वेब ऐप के विपरीत) तो आप डेटा रीडर का उपयोग करके प्रत्येक छवि को पढ़ सकते हैं और फ़ाइल को डिस्क पर एक अस्थायी फ़ोल्डर में डंप कर सकते हैं, फिर आप जो भी प्रोसेसिंग कर सकते हैं उसे कर सकते हैं भौतिक फ़ाइल के खिलाफ।

2) छोटे भागों में डेटा को पढ़ें और संसाधित करें। छवियों के कितने बड़े हैं और आप कितनी प्रक्रिया करना चाहते हैं, इस पर निर्भर करते हुए 10k पंक्तियां अभी भी बहुत कुछ हो सकती हैं। एक समय में 5k मूल्य की पंक्तियों को वापस लौटना और एक अलग धागे में और अधिक पढ़ना जब आप प्रक्रिया के लिए 1k तक नीचे आते हैं तो एक निर्बाध प्रक्रिया के लिए बना सकते हैं।

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

0

मैं का उपयोग किया है एक से पहले इस ट्यूटोरियल में उल्लिखित की तरह एक समाधान: http://www.asp.net/(S(pdfrohu0ajmwt445fanvj2r3))/learn/data-access/tutorial-25-cs.aspx

आप बहु सूत्रण इस्तेमाल कर सकते हैं पर अगले कुछ डेटासेट के एक हिस्से (पूर्व खींचने के लिए पहले 1-10,000 और में खींच पृष्ठभूमि 10,001 - 20,000 और 20,001-30,000 पंक्तियों को खींचती है और डेटा के पिछले पृष्ठों को हटाती है (कहें कि यदि आप कोई समस्या है तो स्मृति को बचाने के लिए 50,000 से 60,000 पर पहली 1-10,000 पंक्तियां हटाएं)। और उपयोगकर्ता का उपयोग करें डेटा की अगली रेंज खींचने के लिए पॉइंटर के रूप में वर्तमान "पेज" का स्थान या कुछ ऑफ-ऑफ-रेंज डेटा हटाएं।

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