2016-04-20 6 views
6

मैं आर में कुछ मॉडलिंग एल्गोरिदम के साथ काम कर रहा हूं, जिनमें से एक जावा (bartMachine) में चलता है। मैंने पाया है कि मेरे डेटा के आकार के साथ मुझे मॉडलिंग एल्गोरिदम चलाने से पहले जावा के लिए अधिकतम ढेर स्थान को बढ़ाने की आवश्यकता है।क्या मुझे जावा हेप स्पेस को अधिकतम उपयोग के बाद रीसेट करना चाहिए?

मैं तो इस तरह कर रहा हूँ:

options(java.parameters = "-Xmx16g")

मेरा प्रश्न है, मैं, बाद में ढेर अंतरिक्ष रीसेट करने की आवश्यकता है, तो कोई अन्य एल्गोरिथ्म जावा (या कम से कम उपयोग किया जा रहा है कर वह ढेर जगह)? या जावा को आवंटित स्मृति को बिना प्रदर्शन हानि के आवश्यकतानुसार पुनः दावा किया जाएगा?

मैं पहले से ही इस विषय पर कुछ चारों ओर खोज की है, और मैं समझ कैसे बदलने/ढेर अंतरिक्ष कम करने के लिए। मैं यह भी समझता हूं कि आर/जावा मेमोरी से पुराने ऑब्जेक्ट्स को और अधिक जगह मुक्त करने के लिए कचरा संग्रह करेगा।

मुझे क्या समझ में नहीं आता है कि ढेर की जगह कैसे बदलती है अन्य कार्यक्रमों के लिए उपलब्ध स्मृति को प्रभावित करती है, और चाहे यह आवश्यक है या इस मामले में ढेर आकार के उपयोग को बदलने के लिए भी एक अच्छा विचार है।

Is there a way to lower Java heap when not in use?

Java garbage collector - When does it collect?

http://www.bramschoenmakers.nl/en/node/726

https://cran.r-project.org/web/packages/bartMachine/bartMachine.pdf

उत्तर

5

यह कार्यान्वयन परिभाषित किया है और क्रियान्वयन के आधार पर से प्रभावित:

जवाब/संसाधनों में से कुछ मैं पहले से ही देखा है काफी कुछ पैरामीटर। The garbage collector can affect it। ओरेकल JVM 1.7 का उपयोग कर मैक पर यह समांतर संग्राहक -XX:+UseParallelGC पर डिफ़ॉल्ट होता है और यह संग्राहक ओएस को स्मृति को वापस नहीं छोड़ता है। मैंने इसे मैक पर करने की कोशिश की और यह कुछ भी मुक्त नहीं हुआ लेकिन -XX:+UseG1GC का उपयोग कर रहा था। आप देख सकते हैं कौन-सा संस्करण आप इस का उपयोग कर के लिए डिफ़ॉल्ट है:

java -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -version 

में कुछ मानकों को आप आप एक JVM है कि यह और सही कचरा कलेक्टर का समर्थन करता है उपयोग कर रहे हैं tweak करने के लिए कैसे स्मृति जारी किया गया है का उपयोग कर सकते हैं, यानी

-XX:MinHeapFreeRatio (default is 40) 
-XX:MaxHeapFreeRatio (default is 70) 

पर वे हिट रहे हैं और याद आती है (JVM का फैसला करता है जब यह स्मृति जारी करता है, सिर्फ वस्तुओं की एक टन यह ट्रिगर नहीं हो सकता है को मुक्त)।

5

गैर-एमएल प्रोग्राम के साथ काम करने के बाद हाल ही में जावा-भारी है, मुझे आपका दर्द महसूस होता है।

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

केवल बार मैंने कभी स्मृति शेष नहीं है (यहां तक ​​कि बड़े पैमाने पर फ्लैट फाइलों के साथ काम) है जब मैं किसी तरह से JVM उपयोग किया गया है:

यहाँ क्यों है। यह एक बार बात नहीं है, यह अक्सर हुआ है।

यह जावा चालित एक्सएलकनेक्ट के माध्यम से बड़ी एक्सेल फ़ाइलों को पढ़ने और लिखने का भी होता है; स्मृति जल्दी से सुपर जाम हो जाता है। यह एक दूसरे के साथ आर और जावा खेलने के तरीके में विफलता प्रतीत होता है।

और, आर स्वचालित रूप से कचरा नहीं लेता है जिस तरह से आप उम्मीद करेंगे। यह तब संग्रहित होता है जब ओएस अधिक स्मृति मांगता है, लेकिन ऐसा होने से पहले चीजें धीमी हो सकती हैं।

भी आर केवल स्मृति में वस्तुओं को देखता है जो इसे बनाता है, न कि यह व्याख्या करता है, इस प्रकार आपका जावा कल्च आर के बारे में अनजान हो जाएगा। इसलिए यदि JVM ने इसे बनाया है, तो जावा इसे ऐसा नहीं करेगा अगर जावा ऐसा नहीं करता है निष्क्रिय होने से पहले। और यदि स्मृति को चुनिंदा रीसाइक्लिंग किया जाता है तो आप विखंडित स्मृति अंतराल कर सकते हैं जो प्रदर्शन को बहुत प्रभावित करता है।

मेरा व्यक्तिगत दृष्टिकोण सेट, चर, फ्रेम बनाने के लिए किया गया है ... केवल मुझे जो चाहिए, सबसेट करें, फिर rm() और gc() ... कचरा संग्रह को हटाएं और मजबूर करें।

अगले चरण पर जाएं और भारी उठाने करें। यदि मैं जावा-आधारित पैकेज चलाता हूं, तो स्मृति को साफ रखने के लिए मैं इसे अधिक बार शुद्ध कर दूंगा।

जावा प्रक्रिया पूरी होने के बाद, मैं सब कुछ साफ़ करने के लिए detach(yourlibraryname) और gc() का उपयोग करता हूं।

यदि आपने 'ढेर' को समायोजित किया है, तो मैं जावा को गतिशील स्मृति को आवंटित आवंटन को कम करने के लिए फिर से समायोजित लिखूंगा, क्योंकि जावा वर्चुअल मशीन अभी भी व्यस्त है लेकिन ऑपरेट नहीं कर रही है, तो आर को वापस लेने का कोई तरीका नहीं है जहां तक ​​मैं पता लगाने में सक्षम हूं। तो आपको इसे रीसेट करना चाहिए और आर को वापस देने के लिए आर का उपयोग करना है। मुझे लगता है कि लंबे समय तक यह आपको तेजी से प्रसंस्करण और कम लॉक-अप के साथ लाभान्वित करेगा।

सबसे अच्छा तरीका है पता करने के लिए के रूप में प्रयोग कर रहे हैं देखने के लिए कितनी देर तक अपनी स्क्रिप्ट दोनों के साथ और मजबूर कचरा संग्रह, निकालना टुकड़ी और ढेर पुनः आबंटन के बिना ले जाता है यह एक sys.time या proc.time समारोह का उपयोग करने के लिए है कि कैसे यह आपके सिस्टम को प्रभावित करता है।

आप कैसे इस यहाँ करने के लिए पर एक ठोस समझ प्राप्त कर सकते हैं:

IDRE -UCLE proc.time functions

आशा यह कुछ मदद करता है!

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