2011-10-21 12 views
21

32-बिट ऑपरेटिंग सिस्टम के तहत, जहां किसी भी प्रोग्राम को आवंटित अधिकतम मेमोरी सीमित है, गणित कृत्रिम रूप से कर्नेल को समाप्त करता है और अधिकतम मेमोरी आवंटन त्रुटि देता है।गणित स्मृति उपयोग को कैप करने के लिए सही तरीका?

64-बिट ओएस पर हालांकि, गणित मुक्त रूप से उपलब्ध सभी मेमोरी का उपयोग करेगा और सिस्टम को रोक देगा। इसलिए, स्मृति उपयोग को कैप करने का सही तरीका क्या है? MemoryConstrained$Pre या CellEvaluationFunction के साथ संयुक्त हो सकता है लेकिन मैं इस उद्देश्य के लिए इनमें से किसी एक को जोड़ना नहीं चाहता हूं, या इस फ़ंक्शन को शामिल करने के लिए मौजूदा उपयोगों को संशोधित करना होगा।

क्या वैश्विक स्तर पर स्मृति उपयोग को प्रतिबंधित करने का कोई दूसरा तरीका है, जैसे कि कर्नेल ध्वज, या सिस्टम $ विकल्प?

+1

एक अच्छा ऑपरेटिंग सिस्टम उपयोगकर्ता कार्यक्रम के लिए अपने संसाधनों, CPU और स्मृति सहित की एक कामयाब दृश्य पेश करने के लिए सक्षम होना चाहिए। –

+0

@ अविश्वासी स्पष्ट रूप से आदमी बोलते हैं, आप क्या कह रहे हैं? ;-) क्या विंडोज 7 के तहत अधिकतम रैम सेट करने का कोई विकल्प है? बेशक यह मानता है कि विंडोज अच्छा है ... –

+3

मैं _good_ ऑपरेटिंग सिस्टम के बारे में बात कर रहा था;) ... नहीं, वास्तव में मुझे Win7 –

उत्तर

14

में मेथेमेटिका 8 आप एक स्मृति प्रहरी, की तर्ज पर कुछ शुरू कर सकता है:

maxMemAllowed  = 15449604; 
intervalBetweenTests = 1; (*seconds*) 
iAmAliveSignal  = 0; 
Dynamic[iAmAliveSignal] 
RunScheduledTask[ 
     If[MemoryInUse[] > maxMemAllowed , Quit[], iAmAliveSignal++],  
     intervalBetweenTests]; 

RemoveScheduledTask[ScheduledTasks[]]; 

उसे निष्क्रिय करने को चलाने के लिए याद रखें।

संपादित

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

maxMemAllowed = 1.3 1024^3; (*1.3 GB*) 
intervalBetweenTests = 1; (*Seconds*) 
iAmAliveSignal = 0; 
leyendToPrint = ""; 
Dynamic[leyendToPrint] 
RunScheduledTask[ 
    If[MemoryInUse[] > maxMemAllowed, 
    CreateDialog[CancelButton["Max Mem Reached", DialogReturn[]]]; 
    Quit[], 
    Print["Memory in use: ", MemoryInUse[]]; 
    leyendToPrint = 
    "Seconds elapsed = " <> ToString[iAmAliveSignal++]], 
    intervalBetweenTests]; 
IntegerPartitions[320, {15}]; 

enter image description here

+1

स्वीकार कर सकते हैं संपादित करें। अगर हम पुष्टि प्राप्त कर सकते हैं कि यह अन्य ऑपरेटिंग सिस्टम में काम करता है, तो मैं जवाब स्वीकार करूंगा। फिर से धन्यवाद। –

+0

@belisarius +1 दिलचस्प विचार। क्या यह फ़ंक्शन कर्नेल को उसी या नए कोड से पुनरारंभ करने के लिए बढ़ाया जा सकता है यदि पिछले सत्र ताजा MathKernel सत्र नहीं था? –

+0

@Alexey मुझे वास्तव में पता नहीं है :( –

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