Почему память моего приложения взрывается, когда я пишу несколько частей

1

У меня есть приложение С# (.NET 4.0), которое загружает локальные файлы из файловой системы, используя запрос формы с несколькими частями. Вот поток запросов:

Stream stream = webrequest.GetRequestStream();

и вот как я загружаю файл, используя поток:

byte[] headerbytes = Encoding.UTF8.GetBytes(header);
stream.Write(headerbytes, 0, headerbytes.Length);

using (FileStream fileStream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read))
{
    byte[] buffer = new byte[1024];
    int bytesRead = 0;
    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
    { stream.Write(buffer, 0, bytesRead); }
}

byte[] newlineBytes = Encoding.UTF8.GetBytes("\r\n");
stream.Write(newlineBytes, 0, newlineBytes.Length);

("поток" закрывается позже в коде ")

Мое приложение запускается, и он зависает около 20 МБ ОЗУ в процессе. Когда я загружаю файл размером 100 МБ, мое приложение переходит на 120 МБ ОЗУ. Когда я загружаю файл 700 МБ, мое приложение переходит на 720 МБ ОЗУ. Кажется, он тоже не собирает мусор. Я профилировал приложение и stream.Write() - это то, что вызывает избыточное выделение памяти.

Это утечка? Что я могу сделать?

  • 0
    Было бы полезно, если бы вы могли рассказать нам, как вы определяете используемую оперативную память. Высокий уровень использования неиспользуемой оперативной памяти не обязательно является проблемой, при условии, что оперативная память высвобождается, когда она требуется в другом месте.
  • 0
    Всегда забавно видеть "Мое приложение использует память / процессор / диск ... как это остановить?" Что касается памяти - не смотрите в диспетчере задач, а вместо этого на счетчиках производительности .Net используйте профилировщик памяти, чтобы проверить использование памяти (или, по крайней мере, GC.Collect () + GC.GetTotlaMemory ).
Показать ещё 2 комментария
Теги:
httpwebrequest

1 ответ

0
Лучший ответ

Поток, возвращаемый методом GetRequestStream, по умолчанию имеет GetRequestStream записи по умолчанию. Вместе с относительно быстрым чтением с диска и медленной записью в сетевой интерфейс дает эффект сохранения почти полного файла в памяти.

Вы можете либо попытаться заставить поток запроса записать данные в базовый сетевой поток, вызвав метод Flush либо попытаться установить для свойства AllowWriteStreamBuffering WebRequest значение false.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню