Benim çalışma yerimde bir ASP.net sitesinde, aşağıdaki dosya kodu dosya indirme işlemlerini yürütmekten sorumludur (NOT: Response.TransmitFile, içeriğin indirilmesinden dolayı burada kullanılmaz.) bir zip dosyası akışı yapılan:ASP.net kullanım sırasında bellek kullanımı
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();
}
Kullanıcılarımız sık oldukça hızlı sunucu belleği çiğnemek multi-yüz MB dosyalarını indirmek. Benim varsayımım bunun yanıt tamponlaması nedeniyle olmasıdır. bu mantıklı mı?
Sadece Response nesnesinin 'buffer' özelliği hakkında okudum. Bunu false olarak ayarlarsanız, Response.BinaryWrite() çağrıları bellekteki verileri arabelleğe almayı engeller mi? Genel olarak, bu durumda bellek kullanımını sınırlamak için iyi bir yol nedir? Belki de posta dosyasından geçici bir dosyaya akışı yapmalıyım, sonra Response.TransmitFile()?
DÜZENLEME: Olası çözümlere ek olarak, yukarıdaki kodda bulunan bellek kullanımı sorununu açıklamak istiyorum. Neden her döngü yineleme üzerinde Response.Flush çağrılsa bile, bu neden 1MB'den daha fazla tüketir? Her döngü yinelemesinde (ve hemen GC'leri almaz) ortaya çıkan gereksiz yığın ayırma mı yoksa işte başka bir şey mi var?
bilgiçlik taslayan Yorum düzeltmek için düzenlendi: 8k = 8192 byte; –
thanx - sabit - biz geeks özenle doğru olmalı – Ray
Response.Write kullanarak doğrudan Response.OutputStream nesnesine yazmak arasındaki fark nedir? – Odrade