2011-02-05 14 views
5

私はある場所に立ち往生しています。私はURLからflvファイルを読んでいます。これをストリームに読み込み、このストリームをループ内のMemoryStreamに書き込んでいます。コードがループから抜けると、私はMemoryStream全体をByteArrayに書き込み、次にこのByteArrayを私のハードディスク上のローカルファイルに書き込みます。複数のスレッドでMemoryStreamにストリームを読み取る

このflvは大きすぎるため、ループ処理に多くの時間がかかります。私は複数のスレッドでMemoryStreamのオリジナルの大きなストリームを読むことを考えています。これは、ストリームを例えば10分割し、これらの部分を複数のスレッドでMemoryStreamに書き込むことを意味します。これはどうすればいいですか?

私は自分のコードを添付しています。

//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

大きなストリームをスレッド内のmemorystreamに読み込めたら、処理を高速化できます。 –

+0

この場合のボトルネックは、ネットワークを介して到着するのにかかる時間であり、それを読み取ってメモリ内で移動するのにかかる時間ではありません。 –

答えて

2

を高く評価しています。ここでの制限要因は、コンピュータがデータを処理する速度ではなく、サーバーからのデータの転送速度です。

複数のスレッドを使用してこれをスピードアップしようとするのではなく、WebRequestではなくWebClientを作成することをお勧めします。 WebClient.DownloadDataAsyncを呼び出して、バックグラウンドでデータをメモリにダウンロードしたり、WebClient.DownloadFileAsyncに電話してファイルに直接ダウンロードしたりすることができます。

これらのいずれもダウンロードを高速化することはできませんが、ダウンロード中にユーザーインターフェイスが応答しなくなることはありません。

+0

しかし、マルチセグメント化されたダウンロードはどのように機能しますか? –

+1

マルチセグメントダウンロードは、HTTP範囲GET要求を利用します。複数の同時要求を同じサーバーまたはミラーに送信します。実行中の複数のスレッドがあり、それぞれがファイルの異なる部分をダウンロードしています。さらに、別のスレッドを制御し、すべてのセグメントがダウンロードされた後、ファイルの別々の部分をまとめて処理する何らかの管理タスクがあります。例については、http://www.codeproject.com/KB/IP/MyDownloader.aspxを参照してください。 –

1

スレッドはあなたを助けません。あなたはIOでブロックされます。 IO上で1つのスレッドがブロックされているのではなく、IO上で複数のスレッドがブロックされるようになりました。実際、多くの場合、複数のスレッド上の同じリソース(またはパラレルではあるが関連するリソース)と通信すると、は、のIOスループットとスレッディングオーバーヘッドになります。失う:失う。

また、ほとんどのストリームはであり、スレッド化のために設計されていません。;ストリームを正しい順序で再構築し、内部状態を崩さないようにするために、非常に複雑なコーディネーションコードが必要です。率直に言って、それは価値がありません。

関連する問題