Wykorzystanie pamięci ASP.net podczas pobierania
Na stronie ASP.net w moim miejscu pracy za obsługę pobierania plików odpowiada następujący fragment kodu (UWAGA: Response.TransmitFile nie jest tutaj używany, ponieważ zawartość pobierania jest przesyłana strumieniowo z pliku 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();
}
Nasi użytkownicy często pobierają wielomilionowe pliki, które mogą szybko przejąć pamięć serwera. Przypuszczam, że jest to spowodowane buforowaniem odpowiedzi. Czy to ma sens?
Właśnie przeczytałem o właściwości 'buffer' obiektu Response. Jeśli ustawię to na false, czy uniemożliwi to wywołanie Response.BinaryWrite () z buforowania danych w pamięci? Ogólnie, jaki jest dobry sposób na ograniczenie wykorzystania pamięci w tej sytuacji? Być może powinienem przesyłać strumieniowo z zip do pliku tymczasowego, a następnie wywoływać Response.TransmitFile ()?
EDYCJA: Oprócz możliwych rozwiązań, jestem bardzo zainteresowany wyjaśnieniami problemu użycia pamięci obecnego w powyższym kodzie. Dlaczego miałoby to pochłaniać znacznie więcej niż 1 MB, mimo że Response.Flush jest wywoływany w każdej iteracji pętli? Czy jest to tylko niepotrzebna alokacja sterty, która pojawia się przy każdej iteracji pętli (i nie dostaje GC od razu), czy jest coś innego w pracy?