2010-11-06 25 views
5

में अस्थायी चर मैंने मैथ्यूमिका नामक गणित के लिए एक पैकेज लिखा है। संक्षेप में, यह आपको पाइथन में जैसे ही गणित में ऑब्जेक्ट ओरिएंटेशन का उपयोग करने की अनुमति देता है। कृपया विवरण के लिए Voofie/MathOO में निम्न लेख पढ़ें:गणित

MathOO: Adding Python style Object Orientation to Mathematica with MathOO (1.0 beta launch) [Alternative to Objectica]

समस्या मैं का सामना करना पड़ा है कि, मैं कचरा कलेक्टर है, ताकि उपयोगकर्ता स्पष्ट रूप से उपयोग करने के बाद ऑब्जेक्ट को हटाने की जरूरत नहीं है चाहते हैं। उदाहरण के लिए:

NewClass[Object1] 
Object1.$init$[self_]:= Return[]; 

ऊपर दो पंक्तियों में, मैं सिर्फ Object1 परिभाषित एक नया वर्ग है, और निर्माता एक खाली समारोह होने के लिए। यदि आप पाइथन से परिचित हैं, तो आपको __init__() के साथ समानता दिखाई देनी चाहिए।

एक Object1 का दृष्टांत के लिए, मुझे क्या करना:

object1 = new[Object1][] 

उत्पादन होता है:

Out: object$13 

यहाँ, आपत्ति $ 13 एक अस्थायी चर रहा है। मैं क्या चाहता हूं, जब इस अस्थायी चर के संदर्भ नहीं हैं, तो इसे स्वचालित रूप से हटा दिया जाना चाहिए। लेकिन यह उम्मीद के रूप में काम नहीं करता है। मैं इस समस्या की पहचान की है निम्नलिखित हो:

In: y = Module[{x}, x[1] = 2; x] 
Out: x$117 

In: FullDefinition[y] 
Out: y = x$117 
    Attributes[x$117] = {Temporary} 
    x$117[1] = 2 

के बाद से y एक्स $ 117 के लिए एक संदर्भ रखती है, तो $ 117 x अभी तक नहीं हटाया जाता है। अब हम 1 करने के लिए y का मूल्य निर्धारित करके संदर्भ डिलीट:

In: y = 1; 

हालांकि, x $ 117 अभी भी यहाँ है:

In: Definition[x$117] 
Out: Attributes[x$117] = {Temporary} 
    x$117[1] = 2 

लेकिन मैं के बाद से यह अब संदर्भित है चर हटाया जा करने की उम्मीद । मेथेमेटिका के manual से, यह कहा:

इसलिए, यह मेथेमेटिका के एक बग है: अगर वे अब संदर्भित कर रहे हैं

अस्थाई प्रतीकों निकाल दिए जाते हैं? या क्या कोई कामकाज तरीका है? मैं गणित 7.0 का उपयोग कर रहा हूँ। आपका बहुत बहुत धन्यवाद।

+0

देखें [यह उत्तर] (http: // 'मॉड्यूल' से संबंधित कचरा कलेक्टर में कुछ कीड़े के लिए stackoverflow.com/questions/6867892/reducing-memory-usage-in-an-extended-mathematica-session/6873142#6873142)। –

उत्तर

2

गणित वास्तव में कचरा करता है Temporary चर जब उनके पास कोई संदर्भ नहीं है। उस ने कहा, दो कारण हैं कि आपका एक्स $ 117 कचरा नहीं है।

  1. याद रखें कि Module शाब्दिक scoping का उपयोग करता है, तो मॉड्यूल चर केवल "स्थानीय" भावना वे एक अद्वितीय नाम "var $ modnum" और TemporaryAttribute दे रहे हैं कि कर रहे हैं। चूंकि आपने अपना xDownValue दिया है, इसलिए इसे x से पहले साफ़ किया जाना चाहिए कचरा एकत्र किया जा सकता है।

  2. आपका y अस्थायी चर x$... होने के लिए स्थापित किया गया था और उत्पादन Out[] को सौंपा गया था। तो आपको इतिहास को साफ़ करने की भी आवश्यकता है: Unprotect[In, Out]; Clear[In, Out]; Protect[In, Out];

तब आपका Module उदाहरण उचित रूप से कचरा एकत्रित प्रतीत होता है।


अपने MathOO पैकेज का उपयोग करते समय (कि मैं कल डाउनलोड किया, लेकिन साथ अभी तक नहीं खेला है) हो सकता है आप सिर्फ सेट कर सकते हैं कुछ निश्चित संख्या को $HistoryLength और अनुशंसा करते हैं कि उन instantiations के उत्पादन को दबाने object1 = new[Object1][];

+0

हां। दूसरे बिंदु के लिए, मैं आमतौर पर आउटपुट दबाना होगा। मैंने छोड़ा; सिर्फ प्रोग्राम के लिए वैरिएबल नाम आउटपुट करने के लिए ताकि मैं बाद में इसकी परिभाषा देख सकूं। अब, मुख्य समस्या यह है कि, मुझे नहीं पता कि उपयोगकर्ता कोई संदर्भ नहीं देगा, और डाउनवैल्यू एक जरूरी है। क्या डाउनवैल्यू एक और संदर्भ है जो एक्स के दायरे से बाहर है? मैं डाउनवैल्यू को साफ़ नहीं करना चाहता था, और उम्मीद करता हूं कि यह अभी भी कचरा एकत्रित हो सकता है। – Ross

+0

मैं चर के रूप में चर का उपयोग करना चाहता हूँ। पायथन में dict की तरह। जब परिवर्तनीय का कोई संदर्भ नहीं है, तो डाउनवैल्यू का कोई मतलब नहीं है, और इसलिए कचरा एकत्र किया जाना चाहिए। मुझे समझ में नहीं आता क्यों मैथमैटिका इसे इकट्ठा नहीं करता है और सोचता है कि मैं अभी भी इसका उपयोग करना चाहता हूं। – Ross

+1

ध्यान दें कि ';' के साथ आउटपुट दबाने से वास्तविक वापसी मान को 'आउट [n]' में असाइन नहीं किया जाता है। –

1

मेथेमेटिका (नीचे) एक स्ट्रिंग को फिर से लिखने प्रणाली (एक तरह से) (वास्तव में नहीं) (लेकिन वास्तव में) (फिर भी ...) DownValue "x $ 117 है [1] = 2 "एक स्ट्रिंग रीराइटिंग नियम है कि कल्पना करने के लिए यह पूरी तरह से गलत नहीं है एक एसोसिएटिव सरणी में एक प्रविष्टि है। सरणी को "x $ 117" नाम दिया गया है और प्रविष्टि जोड़ी {1,2} है। जब तक सरणी में कोई प्रविष्टि होती है, तब तक प्रतीक "x $ 117" का संदर्भ दिया जाता है और एमएमए द्वारा जीसीड नहीं किया जाएगा।

आपकी सबसे अच्छी शर्त [] प्रतीकों को निकालने या दायरे से बाहर जाने के लिए निकालना है। (स्पष्ट [] अपर्याप्त है क्योंकि प्रतीकों से जुड़े लिंग, गुण, या डिफ़ॉल्ट को साफ़ नहीं किया जाता है [] और इसलिए एमएमए अभी भी प्रतीक के लाइव संदर्भ रखेंगे।)