OutOfMemoryException ao enviar um arquivo grande de 500 MB usando o FileStream ASPNET

Estou usando o Filestream para ler arquivos grandes (> 500 MB) e recebo a OutOfMemoryException.

Eu uso Asp.net, .net 3.5, win2003, iis 6.0

Eu quero isso no meu aplicativo:

Leia DATA do Oracle

Descompacte o arquivo usando o FileStream e o BZip2

Leia o arquivo descompactado e envie-o para a página asp.net para download.

Quando leio arquivo do disco, falha !!! e obtenha OutOfMemory ...

. Meu código é:

using (var fs3 = new FileStream(filePath2, FileMode.Open, FileAccess.Read)) 
        { 
          byte[] b2 = ReadFully(fs3, 1024); 
        } 

 // http://www.yoda.arachsys.com/csharp/readbinary.html
 public static byte[] ReadFully(Stream stream, int initialLength) 
  { 
    // If we've been passed an unhelpful initial length, just 
    // use 32K. 
    if (initialLength < 1) 
    { 
      initialLength = 32768; 
    } 

    byte[] buffer = new byte[initialLength]; 
    int read = 0; 

    int chunk; 
    while ((chunk = stream.Read(buffer, read, buffer.Length - read)) > 0) 
    { 
      read += chunk; 

      // If we've reached the end of our buffer, check to see if there's 
      // any more information 
      if (read == buffer.Length) 
      { 
        int nextByte = stream.ReadByte(); 

        // End of stream? If so, we're done 
        if (nextByte == -1) 
        { 
          return buffer; 
        } 

        // Nope. Resize the buffer, put in the byte we've just 
        // read, and continue 
        byte[] newBuffer = new byte[buffer.Length * 2]; 
        Array.Copy(buffer, newBuffer, buffer.Length); 
        newBuffer[read] = (byte)nextByte; 
        buffer = newBuffer; 
        read++; 
      } 
    } 
    // Buffer is now too big. Shrink it. 
    byte[] ret = new byte[read]; 
    Array.Copy(buffer, ret, read); 
    return ret; 
  } 

Agora, eu especifico melhor meu problema.

Descompacte o arquivo usando o FileStream e o BZip2 está OK, está tudo certo.

O problema é o seguinte:

Leia o arquivo grande e gordo no disco (> 500 MB) no byte [] e envie bytes para o Response (asp.net) para fazer o download.

Quando usar

http://www.yoda.arachsys.com/csharp/readbinary.html

public static byte[] ReadFully

Eu recebo o erro: OutOfMemoryException ...

Se melhor BufferedStream do que Stream (FileStream, MemoryStream, ...) ??

Usando BufferedStream, posso ler um arquivo grande de 700 MB ?? (qualquer fonte de código de amostra usando o BufferedStream para baixar arquivos grandes)

Penso que esta é a questão: não "como ler um arquivo de 500 MB na memória?" , Mas "como enviar um arquivo grande para o fluxo de resposta do ASPNET?"

Encontrei este código por Cheeso:

using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))  
{  
   Response.BufferOutput= false;   // to prevent buffering 
   byte[] buffer = new byte[1024]; 
   int bytesRead = 0; 
   while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)  
   { 
       Response.OutputStream.Write(buffer, 0, bytesRead); 
   } 
}

É um bom código ?? alguma melhoria para alto desempenho ??

Um colega me diga, use

Response.TransmitFile(filePath);

Agora, outra pergunta, melhor TransmitFile ou código de Cheeso ??

Há muitos anos, na revista msdn aparece um ótimo artigo sobre isso, mas não consigo acessarhttp://msdn.microsoft.com/msdnmag/issues/06/09/WebDownloads/,

Atualizar: Você pode acessar usandowebarchive no link:https://web.archive.org/web/20070627063111/http://msdn.microsoft.com/msdnmag/issues/06/09/WebDownloads/

Alguma sugestão, comentário, fonte de código de exemplo?

questionAnswers(3)

yourAnswerToTheQuestion