На сайте ASP.net на моем рабочем месте следующий фрагмент кода отвечает за загрузку файлов (ПРИМЕЧАНИЕ. Response.TransmitFile здесь не используется, поскольку содержимое загрузки передается из zip-файла) :
private void DownloadFile( Stream stream)
{
int bytesRead;
int chunkSize = 1048576; //1MB
byte[] readBuffer = new byte[chunkSize];
while ((bytesRead = stream.Read(readBuffer, 0, readBuffer.Length)) != 0)
{
if(!Response.IsClientConnected)
break;
byte[] chunk = new byte[bytesRead];
Array.Copy(readBuffer,0,chunk,0,bytesRead);
Response.BinaryWrite(chunk);
Response.Flush();
}
stream.Close();
}
Наши пользователи часто загружают файлы размером в несколько сотен МБ, которые могут довольно быстро перегружать память сервера. Я предполагаю, что это связано с буферизацией ответа. Имеет ли это смысл?
Я только что прочитал о свойстве 'buffer' объекта Response. Если я установлю это в false, это предотвратит вызовы Response.BinaryWrite () для буферизации данных в памяти? В общем, что является хорошим способом ограничения использования памяти в этой ситуации? Возможно, мне следует выполнить потоковую передачу из zip во временный файл, а затем вызвать Response.TransmitFile ()?
РЕДАКТИРОВАТЬ: В дополнение к возможным решениям меня очень интересуют объяснения проблемы использования памяти, представленной в приведенном выше коде. Почему это потребляет гораздо больше, чем 1 МБ, даже если Response.Flush вызывается на каждой итерации цикла? Является ли это просто ненужным выделением кучи, которое происходит на каждой итерации цикла (и сразу не получает GC), или есть что-то еще в работе?