2015-05-15 5 views
20

मैं 16 जीबी राम और 64 बिट ओएस के साथ एक लिनक्स मशीन पर पायथन 2.7 चलाता हूं। मैंने लिखा एक पायथन लिपि मेमोरी में बहुत अधिक डेटा लोड कर सकती है, जो मशीन को उस बिंदु तक धीमा कर देती है जहां मैं प्रक्रिया को और भी मार नहीं सकता।स्मृति उपयोग सीमित करें?

मैं फोन करके स्मृति को सीमित कर सकते हैं: स्क्रिप्ट चलाने से पहले

ulimit -v 12000000 
मेरी खोल में

, मैं स्क्रिप्ट अपने आप में एक सीमित विकल्प शामिल करना चाहते हैं। जहां भी मैंने देखा, resource मॉड्यूल को ulimit के समान शक्ति के रूप में उद्धृत किया गया है। लेकिन कॉलिंग:

import resource 
_, hard = resource.getrlimit(resource.RLIMIT_DATA) 
resource.setrlimit(resource.RLIMIT_DATA, (12000, hard)) 

मेरी लिपि की शुरुआत में बिल्कुल कुछ भी नहीं है। यहां तक ​​कि 12000 के रूप में कम मान को सेट करने से प्रक्रिया को कभी भी क्रैश नहीं हुआ। मैंने उसी परिणाम के साथ RLIMIT_STACK के साथ भी कोशिश की। उत्सुकता से, कॉलिंग:

import subprocess 
subprocess.call('ulimit -v 12000', shell=True) 

कुछ भी नहीं करता है।

मैं क्या गलत कर रहा हूं? मुझे ऑनलाइन कोई वास्तविक उपयोग उदाहरण नहीं मिल सका।

+0

क्या प्रोग्राम को और अधिक मेमोरी-कुशल बनाने के लिए कोई जगह है? – TigerhawkT3

+1

वहाँ है, लेकिन इसमें कुछ समय लगेगा। फिलहाल, मुझे इसका परीक्षण करने और यह सुनिश्चित करने की ज़रूरत है कि यह कंप्यूटर को बंद नहीं करता है। और स्मृति के लिए एक असफल-सुरक्षित होने के बाद भी उपयोगी होगा। – Arne

+1

चूंकि यह पायथन 2.7 में है, पाइथन 3 पर स्विच करने और आपके प्रोग्राम पर 2-से-3 कनवर्टर का उपयोग करने के बारे में कैसे? पायथन 3 में पाइथन 2 पर कई प्रदर्शन सुधार हैं, जिनमें से कुछ स्मृति-संबंधित हैं। – TigerhawkT3

उत्तर

12

resource.RLIMIT_VMEM संसाधन corresponding to ulimit -v है।

RLIMIT_DATAonly affects brk/sbrk system calls जबकि newer memory managers tend to use mmap instead

दूसरी बात यह है कि ulimit/setrlimit केवल वर्तमान प्रक्रिया और उसके भविष्य के बच्चों को प्रभावित करता है।

AttributeError: 'module' object has no attribute 'RLIMIT_VMEM' संदेश के बारे में: resource module docs इस संभावना का उल्लेख:

This module does not attempt to mask platform differences — symbols not defined for a platform will not be available from this module on that platform.

bashulimit source ऊपर लिंक किए गए के अनुसार, यह का उपयोग करता है RLIMIT_ASRLIMIT_VMEM अगर परिभाषित नहीं है।

+1

मैं मल्टीथ्रेडिंग का उपयोग नहीं करता, इसलिए मुझे उम्मीद है कि यह समस्या नहीं है। लेकिन जब मैं 'RLIMIT_DATA' दर्ज करते हैं, मैं निम्न त्रुटि संदेश मिलता है: ' Traceback (सबसे हाल कॉल पिछले): sys.exit में फ़ाइल "my_script.py", लाइन 417, (मुख्य()) फ़ाइल "my_script।पीई ", लाइन 3 9 1, मुख्य _ में, हार्ड = resource.getrlimit (resource.RLIMIT_VMEM) विशेषताएँ: 'मॉड्यूल' ऑब्जेक्ट में कोई विशेषता नहीं है 'RLIMIT_VMEM' आपके द्वारा संदर्भित सूची से, सभी फ़ील्ड मिल सकते हैं - सिवाय यह एक। मैं इसे अभी Python 3.x के साथ चलाने की कोशिश कर रहा हूं .. – Arne

+0

स्पष्टीकरण के लिए धन्यवाद! – Arne

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