2008-09-26 12 views
9

मुझे एक समस्या है जिसके लिए मुझे दूरस्थ मशीन से कई लॉग फ़ाइलों को पार्स करने की आवश्यकता है। कुछ जटिलताओं के होते हैं: 1) फ़ाइल उपयोग 2 में हो सकता है) फ़ाइलें काफी बड़ा हो सकता है (100 एमबी +) 3) प्रत्येक प्रविष्टि बहु लाइननेटवर्क पर बड़ी टेक्स्ट फ़ाइल को पढ़ने और पार्स करने का सबसे अच्छा तरीका क्या है?

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

पार्सिंग समय बढ़ाने के लिए, मैं पार्सर बहु-थ्रेडेड बनाना चाहता हूं, लेकिन यह बहु-पंक्तिबद्ध प्रविष्टियों से थोड़ा सा ट्रिकियर से निपटता है।

दो मुख्य मुद्दे हैं:? 1) कैसे मैं फाइल स्थानांतरण (संपीड़न में तेजी लाने करते ?, स्थानीय रूप से स्थानांतरित कर रहा है और भी आवश्यक ?, सकते हैं कि मैं एक प्रयोग फ़ाइल में किसी अन्य तरह से पढ़ें) 2) कैसे मैं करता हूँ धागे के बीच लाइनों को विभाजित करते समय बहु-लाइन प्रविष्टियों से निपटें?

अद्यतन: कारण मैंने सर्वर कारण पर स्पष्ट पार्स नहीं किया है कि मैं जितना संभव हो उतना छोटा सीपीयू प्रभाव रखना चाहता हूं। मैं सिस्टम आईएम परीक्षण के प्रदर्शन को प्रभावित नहीं करना चाहता हूं।

उत्तर

2

यदि आप अनुक्रमिक फ़ाइल पढ़ रहे हैं तो आप इसे नेटवर्क पर लाइन से लाइन में पढ़ना चाहते हैं। आपको स्ट्रीमिंग करने में सक्षम स्थानांतरण विधि की आवश्यकता है। इसे समझने के लिए आपको अपनी आईओ स्ट्रीमिंग तकनीक की समीक्षा करने की आवश्यकता होगी।

इस तरह के बड़े आईओ ऑपरेशंस को मल्टीथ्रेडिंग द्वारा अधिक लाभ नहीं होगा क्योंकि आप संभवतया उन वस्तुओं को संसाधित कर सकते हैं जैसे आप उन्हें नेटवर्क पर पढ़ सकते हैं।

आपका दूसरा शानदार विकल्प सर्वर पर लॉग पार्सर डालना है, और परिणाम डाउनलोड करना है।

+0

यदि नेटवर्क पर सीधे 100 एमबी टेक्स्ट फ़ाइल की प्रतिलिपि बनाना x सेकंड लेता है, और रिमोट क्लाइंट को संपीड़ित करना और फ़ाइल भेजना और फिर डिफ्लेटिंग/रीडिंग x/4 सेकेंड लेता है, तो क्या यह इसके लायक नहीं है? (ध्यान दें, मैं वास्तव में नहीं जानता कि इसे संपीड़ित/भेजने/डिकंप्रेस/पढ़ने के लिए कितना समय लगेगा) – midas06

+0

हर तरह से आप नेटवर्क पर कुछ संपीड़न का उपयोग कर सकते हैं (और चाहिए)। जैसे मैंने कहा, अपने आईओ स्ट्रीमिंग विकल्पों की समीक्षा करें - कुछ लोगों ने कुछ ज़िप पुस्तकालयों का सुझाव दिया। ओटीओएच अगर आप रिमोट एंड पर प्रोग्राम डाल सकते हैं, वहां प्रोसेसिंग करें! –

1

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

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

+0

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

0

मैंने इंटरनेट पर स्थानांतरित करने से पहले बड़ी फ़ाइलों को संपीड़ित करने के लिए SharpZipLib का उपयोग किया है। तो यह एक विकल्प है।

1 के लिए एक और विचार) एक असेंबली बनाना होगा जो रिमोट मशीन पर चलता है और वहां पार्सिंग करता है। आप .NET रीमोटिंग का उपयोग कर स्थानीय मशीन से असेंबली तक पहुंच सकते हैं। रिमोट असेंबली को विंडोज सेवा होना चाहिए या आईआईएस में होस्ट किया जाना चाहिए। इससे आपको एक ही मशीन पर लॉग फाइलों की प्रतियां रखने की अनुमति मिल जाएगी, और सिद्धांत रूप में उन्हें संसाधित करने में कम समय लगेगा।

0

मैं संपीड़न (हवा निकालना/gzip) का उपयोग कर

1

मैं इसे कैसे "दूरस्थ" यह है पर निर्भर करता है लगता है कि मदद मिलेगी लगता है। एक 100 एमबी लैन पर 100 एमबी लगभग 8 सेकेंड होगा ... इसे गीगाबिट तक बढ़ाएं, और आपके पास यह लगभग 1 सेकंड में होगा। कार्ड के लिए $ 50 * 2, और स्विच के लिए $ 100 एक बहुत सस्ता अपग्रेड होगा जो आप कर सकते हैं।

लेकिन, यह मानते हुए कि यह उससे आगे है, आप इसे केवल पढ़ने के मोड के साथ खोलने में सक्षम होना चाहिए (जैसा कि आप इसे कॉपी करते समय इसे पढ़ रहे हैं)। एसएमबी/सीआईएफएस फ़ाइल ब्लॉक पढ़ने का समर्थन करता है, इसलिए आपको उस बिंदु पर फ़ाइल स्ट्रीम करना चाहिए (बेशक, आपने वास्तव में यह नहीं कहा था कि आप फ़ाइल तक कैसे पहुंच रहे थे - मैं बस एसएमबी मान रहा हूं)।

मल्टीथ्रेडिंग मदद नहीं करेगा, क्योंकि आप डिस्क या नेटवर्क को बाध्य करेंगे।

1

स्थानांतरण के लिए संपीड़न का उपयोग करें।

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

1

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

यह कारणों में से एक है कि इतने सारे डेटाबेस सर्वर अंत में संग्रहीत प्रक्रियाओं का उपयोग करते हैं।

मल्टीथ्रेडिंग के उपयोग के माध्यम से पार्सिंग गति (यदि कोई है) में सुधार आपके नेटवर्क हस्तांतरण की तुलनात्मक गति से घूमने जा रहे हैं।

यदि आप उन्हें पार्स करने से पहले अपनी फ़ाइलों को स्थानांतरित करने के लिए प्रतिबद्ध हैं, तो आप जिस विकल्प पर विचार कर सकते हैं वह आपके फ़ाइल स्थानांतरण के दौरान ऑन-द-फ्लाई संपीड़न का उपयोग है। उदाहरण के लिए, sftp सर्वर उपलब्ध हैं जो फ्लाई पर संपीड़न करेंगे। स्थानीय अंत में आप स्थानांतरण के ग्राहक पक्ष को करने के लिए libcurl जैसे कुछ का उपयोग कर सकते हैं, जो ऑन-द-फ्लाई डिकंप्रेशन का भी समर्थन करता है।

1

यदि आप फ़ाइल की प्रतिलिपि बना सकते हैं, तो आप इसे पढ़ सकते हैं। तो इसे पहले स्थान पर कॉपी करने की कोई आवश्यकता नहीं है।

EDIT: FileStream class का उपयोग एक्सेस और साझाकरण मोड पर अधिक नियंत्रण रखने के लिए करें।

new FileStream("logfile", FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 

चाल चलाना चाहिए।

+0

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

+0

आपका सिद्धांत गलत है, imho। विंडोज एक्सप्लोरर एक ही एपीआई .NET (और FileStream) का उपयोग करता है। क्या तुमने कोशिश की? – VVS