2011-11-10 10 views
5

मैं निम्नलिखित कोड है:यह समानांतर क्यों नहीं है। फॉरएच लूप प्रदर्शन में सुधार कर रहा है?

  if (!this.writeDataStore.Exists(mat)) 
      { 
       BlockingCollection<ImageFile> imageFiles = new BlockingCollection<ImageFile>(); 
       Parallel.ForEach(fileGrouping, fi => DecompressAndReadGzFile(fi, imageFiles)); 


       this.PushIntoDb(mat, imageFiles.ToList()); 
      } 

DecompressAndReadGzFile एक ही कक्षा है कि इस विधि में निहित है में एक स्थिर तरीका है प्रति विधि नाम जैसा कि मैंने ऊपर decompressing कर रहा हूँ और GZ फ़ाइलें पढ़ने, उनमें से बहुत से, यानी। 1000 तक, इसलिए समांतरता के उपरांत लाभ के लिए इसके लायक है। हालांकि, मुझे लाभ नहीं दिख रहा है। जब मैं एएनटीएस प्रदर्शन प्रोफाइलर का उपयोग करता हूं, तो मुझे लगता है कि वे बिल्कुल उसी समय चल रहे हैं जैसे कोई समांतरता नहीं हो रही है। मैं प्रोसेस एक्सप्लोरर के साथ सीपीयू कोर भी देखता हूं और ऐसा लगता है कि संभवतः दो कोरों पर काम किया जा रहा है लेकिन एक कोर ज्यादातर काम कर रहा है। मैं समांतर होने तक समझ में नहीं आ रहा हूं। फ़ाइलों को समानांतर में फ़ाइलों को डिक्रॉप करने और पढ़ने के लिए?

अद्यतन प्रश्न: फ़ाइलों की सूची से जानकारी पढ़ने का सबसे तेज़ तरीका क्या है?

समस्या (सरलीकृत):

  1. वहाँ .gz फ़ाइलें (1200) की एक बड़ी सूची है।
  2. प्रत्येक फ़ाइल में "डेटा:" वाली एक पंक्ति होती है, स्थान और रेखा संख्या स्थिर नहीं होती है और फ़ाइल से फ़ाइल में भिन्न हो सकती है। "आंकड़े:"
  3. हम के बाद पहले नंबर को पुनः प्राप्त करने की जरूरत है (बस सादगी की खातिर) और (जैसे एक सूची)

प्रारंभिक सवाल में स्मृति में एक वस्तु में संग्रहीत, मैं समानांतर उपयोग कर रहा था के लिए प्रत्येक लूप लेकिन मैं 1 कोर से अधिक पर सीपीयू बाध्य नहीं लग रहा था।

+0

क्या 'DecompressAndReadGzFile' में कोई सिंक्रनाइज़ेशन किया गया है? – SimonC

+0

ऐसा नहीं है कि मुझे पता है। यद्यपि imageFiles पर एक कॉल है। जोड़ें जो मैं समझता हूं उससे तालाब जोड़ता है। – Seth

उत्तर

12

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

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

(तुम भी विचार करना चाहिए कि आप क्या decompressed फाइलों के साथ कर रहे हैं। आप उन वापस डिस्क के लिए लिख रहे हैं? हां, तो फिर वहाँ संभावना है कि आप मूल रूप से एक ताड़ना डिस्क के लिए इंतजार कर रहे हैं तो।)

+0

मैं डिस्क पर डिकंप्रेस्ड फ़ाइलों को नहीं लिख रहा हूं। मैं GZipStream का उपयोग कर मेमोरी में संपीड़ित फ़ाइलों को पढ़ रहा हूं, जो मुझे उस छवि में डालने की आवश्यकता है उसे निकालने के लिए टेक्स्ट ट्रेडर बना रहा है ऊपर दिए गए कोड में फ़ाइल संग्रह। हालांकि मैं आपकी रैम डिस्क सुझाव का प्रयास कर सकता हूं। – Seth

+0

@ सेठ: ध्यान दें कि रैमडिस्क सुझाव वास्तव में * बस * यह सत्यापित करने के लिए है कि आप सीपीयू-बाध्य के बजाय आईओ-बाउंड हैं।यदि ऐसा है, तो आप लागत को "रैमडिस्क पर डेटा कॉपी करने" चरण में ले जायेंगे। –

+0

साल पहले उन हार्ड डिस्क ड्राइव टर्बो बूस्टर सॉफ्टवेयर ड्राइवरों को याद रखें? उन्होंने मेमोरी में डेटा को संपीड़ित करके डिस्क को I/O तेज बना दिया, और फिर संपीड़ित डेटा को डिस्क पर लिख दिया। – dthorpe

0

क्या कोई मौका है कि आपकी स्थैतिक विधि किसी भी वैश्विक संसाधन को अपनी कॉल के बीच साझा कर रही है। क्योंकि उस स्थिति में इस स्थैतिक विधि को अनुक्रमिक रूप से और समानांतर लाभ नहीं कहा जाएगा। क्या आप अपनी फाइल ग्रुपिंग क्लास कोड डाल सकते हैं?

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