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