На сайте ASP.net на моем рабочем месте отвечает за обработку файлов (ПРИМЕЧАНИЕ: Response.TransmitFile здесь не используется, поскольку содержимое загрузки будучи потоковым из архива):Использование памяти ASP.net во время загрузки
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()?
EDIT: В дополнение к возможным решениям, я очень заинтересован в объяснении проблемы использования памяти, присутствующей в приведенном выше коде. Почему это потребляет намного больше 1 МБ, хотя Response.Flush вызывается на каждой итерации цикла? Это просто ненужное распределение кучи, которое происходит на каждой итерации цикла (и сразу не получает GC'd), или есть что-то еще на работе?
педант комментарий: 8k = 8192 байт; –
thanx - исправлено - мы, выродки, должны быть аккуратно точными – Ray
В чем разница между использованием Response.Write и написанием непосредственно объекта Response.OutputStream? – Odrade