OutOfMemoryException beim Senden einer großen Datei von 500 MB mit FileStream ASPNET

Ich verwende Filestream zum Lesen großer Dateien (> 500 MB) und erhalte die OutOfMemoryException.

Ich benutze Asp.net, .net 3.5, win2003, iis 6.0

Ich möchte dies in meiner App:

DATEN von Oracle lesen

Uncompress-Datei mit FileStream und BZip2

Lesen Sie die unkomprimierte Datei und senden Sie sie zum Herunterladen an die asp.net-Seite.

Wenn ich eine Datei von der Festplatte lese, schlägt dies fehl !!! und OutOfMemory holen ...

. Mein Code ist:

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; 
  } 

Jetzt spezifiziere ich mein Problem besser.

Uncompress-Datei mit FileStream und BZip2 ist in Ordnung, alles ist in Ordnung.

Das Problem ist das folgende:

Lesen Sie die große Datei auf der Festplatte (> 500 MB) in Byte [] und senden Sie die Bytes an Response (asp.net), um sie herunterzuladen.

Bei Verwendung von

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

public static byte[] ReadFully

Ich erhalte den Fehler: OutOfMemoryException ...

Wenn BufferedStream besser ist als Stream (FileStream, MemoryStream, ...) ??

ann ich mit BufferedStream eine große Datei mit 700 MB lesen? (Jede Beispielcodequelle, die BufferedStream zum Herunterladen einer großen Datei verwendet.)

Ich denke, das ist die Frage: Nicht "Wie lese ich eine 500-MB-Datei in den Speicher?" , Aber "Wie sende ich eine große Datei an den ASPNET-Antwort-Stream?"

Ich habe diesen Code von Cheeso gefunden:

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

Ist es ein guter Code? irgendwelche verbesserungen für hohe leistung ??

Ein Kollege sagt mir, benutze

Response.TransmitFile(filePath);

Now, eine andere Frage, besser TransmitFile oder Code von Cheeso ??

Vor vielen Jahren erscheint im MSDN-Magazin ein großartiger Artikel darüber, aber ich kann nicht auf @ zugreifehttp: //msdn.microsoft.com/msdnmag/issues/06/09/WebDownloads,

Aktualisiere: Sie können mit @ zugreif webarchive im Link:https: //web.archive.org/web/20070627063111/http: //msdn.microsoft.com/msdnmag/issues/06/09/WebDownloads

Irgendwelche Vorschläge, Kommentare, Beispielcodequelle ??

Antworten auf die Frage(6)

Ihre Antwort auf die Frage