2010-01-22 9 views
5

मेरे काम के स्थान पर एक एएसपीनेट साइट पर, फ़ाइल डाउनलोड को संभालने के लिए कोड का निम्नलिखित हिस्सा जिम्मेदार है (नोट: 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 नहीं मिलता है), या काम पर कुछ और है?

उत्तर

4

यहां कुछ कोड है जिसके लिए मैं इस पर काम कर रहा हूं। यह फ़ाइल में भाग भेजने के लिए 8000 बाइट बफर का उपयोग करता है। एक बड़ी फाइल पर कुछ अनौपचारिक परीक्षण आवंटित स्मृति में एक महत्वपूर्ण कमी दिखाती है।

int BufferSize = 8000; 
FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read); 
try { 
    long fileSize = stream.Length; 

    long dataLeftToRead = fileSize; 
    int chunkLength; 
    buffer = new Byte[BufferSize]; 

    while (dataLeftToRead > 0) { 
    if (!Response.IsClientConnected) { 
     break; 
    } 
    chunkLength = stream.Read(buffer, 0, BufferSize); 

    Response.OutputStream.Write(buffer, 0, chunkLength); 
    Response.Flush(); 

    dataLeftToRead -= chunkLength; 
    } 
} 
finally { 
    if (stream != null) { 
    stream.Close(); 
} 

में सिंटेक्स त्रुटि और एक लापता मूल्य

+0

पांडित्यदंभी टिप्पणी ठीक करने के लिए संपादित: 8k = 8192 बाइट्स; –

+0

thanx - निश्चित - हम geeks को स्पष्ट रूप से सटीक होना चाहिए – Ray

+2

Response.rut बनाम लिखने के बीच प्रतिक्रिया क्या है प्रतिक्रिया सीधे .OputputStream ऑब्जेक्ट पर? – Odrade

संबंधित मुद्दे