Я использую Filestream для чтения большого файла (> 500 МБ) и получаю исключение OutOfMemoryException.
Я использую Asp.net, .net 3.5, win2003, iis 6.0
Я хочу это в своем приложении:
Чтение данных из Oracle
Распаковкафайл с использованием FileStream и BZip2
Считайте файл без сжатия и отправьте его на страницу asp.net для загрузки.
Когда я читаю файл с диска, происходит сбой !!!и получите OutOfMemory ...
.Мой код:
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;
}
Теперь я уточню свою проблему лучше.
Распакуйте файл с помощью FileStream и BZip2 в порядке, все в порядке.
Проблема в том, чтоследующее:
Считать толстый большой файл на диске (> 500 МБ) в байтах [] и отправить байты в Response (asp.net) для его загрузки.
При использовании
http://www.yoda.arachsys.com/csharp/readbinary.html
public static byte[] ReadFully
Я получаю сообщение об ошибке: OutOfMemoryException ...
Если лучше BufferedStream, чем Stream (FileStream, MemoryStream, ...) ??
Используя BufferedStream, я могу прочитать большой файл 700 МБ ??(любой пример исходного кода, использующий BufferedStream для загрузки большого файла)
Я думаю, это вопрос: а не "как прочитать файл 500 МБ в память?", Но «как отправить большой файл в поток ответов ASPNET?»
Я нашел этот код 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);
}
}
Это хороший код ??какие-либо улучшения для высокой производительности ??
Коллега, скажите мне, используйте
Response.TransmitFile(filePath);
Теперь еще один вопрос, лучше TransmitFile или код от Cheeso ??
Много лет назад, в журнале msdn появляется отличная статья об этом, но я не могу получить доступ к http://msdn.microsoft.com/msdnmag/issues/06/09/WebDownloads/,
Обновление : Вы можете получить доступ с помощью webarchive по ссылке: https://web.archive.org/web/20070627063111/http://msdn.microsoft.com/msdnmag/issues/06/09/WebDownloads/
Любые предложения, комментарии, пример исходного кода ??