2011-02-05 8 views
5

Estoy atrapado en un lugar. Estoy leyendo un archivo FLV desde una URL. Estoy leyendo esto en un Stream y luego escribiendo este Stream en un MemoryStream en un bucle. Cuando el código sale del ciclo, escribo todo el MemoryStream en un ByteArray y luego escribo este ByteArray en un archivo local en mi disco duro.Lectura de flujo a un MemoryStream en múltiples hilos

Como esta flv es demasiado grande, lleva mucho tiempo procesarla en el ciclo. Estoy pensando en leer la secuencia grande original en MemoryStream en varios hilos. Eso significa dividir el flujo en, por ejemplo, 10 partes y escribir estas partes en MemoryStream en varios hilos. ¿Cómo hago esto?

Adjunto mi código.

//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(); 
        } 


       } 

Cualquier ayuda se agradece Gracias

+1

¿Por qué crees que varios hilos te ayudarán aquí? –

+0

Si puedo leer esa secuencia grande en la secuencia de memoria en hilos, realmente puedo acelerar el proceso. –

+0

El cuello de botella en este caso es el tiempo que lleva llegar a través de la red y no el tiempo que lleva leerlo y moverlo a la memoria. –

Respuesta

2

usted no será capaz de acelerar la descarga mediante el uso de múltiples hilos. El factor limitante aquí no es qué tan rápido su computadora puede procesar los datos, sino qué tan rápido los datos provienen del servidor.

En lugar de tratar de acelerar esto usando varios hilos, sugiero que cree un WebClient en lugar de WebRequest. A continuación, puede llamar al WebClient.DownloadDataAsync para descargar datos en la memoria en segundo plano, o llamar al WebClient.DownloadFileAsync para descargar directamente a un archivo.

Ninguno de estos hará que la descarga sea más rápida, pero evitará que la interfaz de usuario no responda durante la descarga.

+0

Pero, ¿cómo funciona la descarga multisegmentada? –

+1

Una descarga multisegmentada aprovecha las solicitudes GET de rango HTTP. Realiza múltiples solicitudes concurrentes (al mismo servidor o a mirrors). Hay varios subprocesos ejecutándose, cada uno descargando diferentes partes del archivo. Además, existe una tarea de gestión de algún tipo que controla los hilos separados y la manipulación junta las partes separadas del archivo una vez que se descargan todos los segmentos. Vea http://www.codeproject.com/KB/IP/MyDownloader.aspx para ver un ejemplo. –

1

Los hilos no te ayudarán aquí; vas a estar bloqueado en IO. En lugar de 1 hilo bloqueado en IO, ahora tendrá múltiples hilos bloqueados en IO. De hecho, en muchos casos, al hablar con el mismo recurso (o recursos paralelos pero relacionados) en varios hilos, disminuirá IO, más los gastos indirectos del enhebrado. Perder perder.

Además, la mayoría de las secuencias son no diseñadas para enhebrar; necesitaría un código de coordinación muy complejo para asegurarse de volver a ensamblar la secuencia en el orden correcto y no estropear el estado interno; francamente, no vale la pena.

Cuestiones relacionadas