2011-02-05 14 views
5

मैं किसी स्थान पर फंस गया हूं। मैं एक यूआरएल से एक फ्लॉव फ़ाइल पढ़ रहा हूँ। मैं इसे स्ट्रीम में पढ़ रहा हूं और फिर इस स्ट्रीम को एक लूप में मेमोरीस्ट्रीम में लिख रहा हूं। जब लूप से कोड निकलता है, तो मैं पूरे मेमोरीस्ट्रीम को बाइटएरे में लिख रहा हूं और फिर अपनी हार्ड डिस्क पर स्थानीय फ़ाइल में इस ByteArray को लिख रहा हूं।एकाधिक थ्रेड में मेमोरीस्ट्रीम में स्ट्रीम पढ़ना

चूंकि यह FLV बहुत बड़ा है, इसमें लूप में प्रक्रिया करने में काफी समय लगता है। मैं कई धागे में मेमोरीस्ट्रीम में मूल बड़ी स्ट्रीम पढ़ने की सोच रहा हूं। इसका मतलब है कि स्ट्रीम को 10 हिस्सों में विभाजित करना और इन हिस्सों को कई धागे में मेमोरीस्ट्रीम में लिखना है। मैं यह कैसे करु?

मैं कोड के अपने टुकड़े को जोड़ रहा हूं।

//Get a data stream from the url 
       WebRequest req = WebRequest.Create(url); 
       WebResponse response = req.GetResponse(); 
       using (Stream stream = response.GetResponseStream()) 
       { 
        //Download in chuncks 
        byte[] buffer = new byte[1024]; 

        //Get Total Size 
        int dataLength = (int)response.ContentLength; 



        //Download to memory 
        //Note: adjust the streams here to download directly to the hard drive 
        using (MemoryStream memStream = new MemoryStream()) 
        { 
         while (true) 
         { 
          //Try to read the data 
          int bytesRead = stream.Read(buffer, 0, buffer.Length); 

          if (bytesRead == 0) 
          { 
           Application.DoEvents(); 
           break; 
          } 
          else 
          { 
           //Write the downloaded data 
           memStream.Write(buffer, 0, bytesRead); 
          } 
         } 

         //Convert the downloaded stream to a byte array 
         byte[] downloadedData = memStream.ToArray(); 
        } 


       } 

किसी भी मदद की सराहना की धन्यवाद

+1

आपको क्यों लगता है कि एकाधिक धागे आपको यहां मदद करेंगे? –

+0

यदि मैं थ्रेड में मेमोरीस्ट्रीम में उस बड़ी स्ट्रीम को पढ़ सकता हूं, तो मैं वास्तव में प्रक्रिया को तेज कर सकता हूं। –

+0

इस मामले में बाधा नेटवर्क के माध्यम से आने का समय है, न कि इसे पढ़ने के लिए और इसे स्मृति में ले जाने के लिए जितना समय लगता है। –

उत्तर

2

आप एक से अधिक थ्रेड का उपयोग करके डाउनलोड तेजी लाने के लिए सक्षम नहीं होगा। यहां सीमित कारक यह नहीं है कि आपका कंप्यूटर डेटा को कितनी तेज़ी से संसाधित कर सकता है, बल्कि सर्वर से डेटा कितनी तेजी से आता है।

एकाधिक धागे का उपयोग करके इसे गति देने की कोशिश करने के बजाय, मैं सुझाव दूंगा कि आप WebRequest के बजाय WebClient बनाएं। फिर आप पृष्ठभूमि में डेटा में डेटा डाउनलोड करने के लिए WebClient.DownloadDataAsync पर कॉल कर सकते हैं, या फ़ाइल पर सीधे डाउनलोड करने के लिए WebClient.DownloadFileAsync पर कॉल कर सकते हैं।

इनमें से कोई भी डाउनलोड को तेज़ी से डाउनलोड नहीं करेगा, लेकिन वे आपके उपयोगकर्ता इंटरफ़ेस को डाउनलोड के दौरान गैर-प्रतिक्रियाशील होने से रोक देंगे।

+0

लेकिन फिर बहुआयामी डाउनलोड कैसे काम करता है? –

+1

एक बहु-खंडित डाउनलोड HTTP श्रेणी GET अनुरोधों का लाभ उठाता है। यह एकाधिक समवर्ती अनुरोध करता है (उसी सर्वर पर, या दर्पण के लिए)। फ़ाइल के विभिन्न हिस्सों को डाउनलोड करने वाले कई थ्रेड चल रहे हैं। इसके अलावा, विभिन्न खंडों को डाउनलोड करने के बाद अलग-अलग धागे को नियंत्रित करने और फ़ाइल के अलग-अलग टुकड़ों को एक साथ रखने के प्रबंधन का प्रबंधन कार्य होता है। उदाहरण के लिए http://www.codeproject.com/KB/IP/MyDownloader.aspx देखें। –

1

धागे आपको यहां मदद नहीं करेंगे; आप आईओ पर अवरुद्ध होने जा रहे हैं। आईओ पर अवरुद्ध 1 थ्रेड के बजाय, अब आपके पास आईओ पर अवरुद्ध एकाधिक थ्रेड होंगे। वास्तव में, कई मामलों में एक ही संसाधन (या समानांतर लेकिन संबंधित संसाधनों) से बात करते हुए कई मामलों में आईओ थ्रूपुट, साथ ही थ्रेडिंग ओवरहेड्स भी कम हो जाएगा। शिथिल शिथिल।

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

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