मेरे काम के स्थान पर एक एएसपीनेट साइट पर, फ़ाइल डाउनलोड को संभालने के लिए कोड का निम्नलिखित हिस्सा जिम्मेदार है (नोट: Response.TransmitFile का उपयोग यहां नहीं किया जाता है क्योंकि डाउनलोड की सामग्री हैं एक ज़िप फ़ाइल से स्ट्रीम किया जा रहा है):डाउनलोड के दौरान एएसपीनेट मेमोरी उपयोग
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();
}
हमारे उपयोगकर्ता अक्सर बहु-सौ एमबी फाइलें डाउनलोड करते हैं, जो सर्वर मेमोरी को बहुत तेजी से चबा सकते हैं। मेरी धारणा यह है कि यह प्रतिक्रिया बफरिंग के कारण है। क्या इसका कोई मतलब है?
मैंने अभी प्रतिक्रिया ऑब्जेक्ट की 'बफर' संपत्ति के बारे में पढ़ा है। अगर मैं इसे गलत पर सेट करता हूं, तो क्या यह प्रतिक्रिया को रोक देगा। बाइनरीवाइट() कॉल को स्मृति में डेटा बफर करने से कॉल करता है? सामान्य रूप से, इस स्थिति में स्मृति उपयोग को सीमित करने का एक अच्छा तरीका क्या है? शायद मुझे ज़िप से एक अस्थायी फ़ाइल में स्ट्रीम करना चाहिए, फिर Response.TransmitFile() पर कॉल करें?
संपादित करें: संभावित समाधानों के अतिरिक्त, मुझे ऊपर दिए गए कोड में मौजूद स्मृति उपयोग समस्या के स्पष्टीकरण में बहुत रूचि है। हालांकि यह 1 एमबी से अधिक क्यों उपभोग करेगा, भले ही Response.Flush प्रत्येक लूप पुनरावृत्ति पर बुलाया जाता है? क्या यह केवल अनावश्यक ढेर आवंटन है जो हर लूप पुनरावृत्ति पर होता है (और तुरंत GC'd नहीं मिलता है), या काम पर कुछ और है?
पांडित्यदंभी टिप्पणी ठीक करने के लिए संपादित: 8k = 8192 बाइट्स; –
thanx - निश्चित - हम geeks को स्पष्ट रूप से सटीक होना चाहिए – Ray
Response.rut बनाम लिखने के बीच प्रतिक्रिया क्या है प्रतिक्रिया सीधे .OputputStream ऑब्जेक्ट पर? – Odrade