2010-10-04 15 views
7

मेरे पास एक लंबी चल रही पायथन प्रक्रिया है जो मैंने योजना बनाई तुलना में अधिक डेटा उत्पन्न कर रही है। मेरे परिणाम एक सूची में संग्रहीत किए जाते हैं जिन्हें प्रोग्राम पूरा होने पर धाराबद्ध (मसालेदार) और डिस्क पर लिखा जाएगा - यदि यह अब तक हो जाता है। लेकिन इस दर पर, यह संभावना है कि सूची सभी 1+ जीबी मुक्त रैम को समाप्त कर देगी और प्रक्रिया क्रैश हो जाएगी, प्रक्रिया में मेरे सभी परिणामों को खो देगा।लिनक्स पर वर्तमान में चल रहे पायथन प्रक्रिया से डेटा संरचना तक कैसे पहुंचे?

मैं समय-समय पर डिस्क पर परिणाम लिखने के लिए अपनी स्क्रिप्ट को संशोधित करने की योजना बना रहा हूं, लेकिन यदि संभव हो तो मैं वर्तमान में चल रही प्रक्रिया के परिणामों को सहेजना चाहता हूं। क्या कोई तरीका है कि मैं एक चल रही प्रक्रिया से इन-मेमोरी डेटा संरचना को पकड़ सकता हूं और इसे डिस्क पर लिख सकता हूं?

मुझे code.interact() मिला, लेकिन चूंकि मेरे पास पहले से ही मेरे कोड में यह हुक नहीं है, यह मेरे लिए उपयोगी नहीं लगता है (Method to peek at a Python program running right now)।

मैं फेडोरा 2.5 पर फेथॉन 2.5 चला रहा हूं। कोई विचार?

बहुत बहुत धन्यवाद।

शाहिन

+0

आप 'वर्तमान प्रक्रिया की डेटा संरचना' के साथ क्या करने की उम्मीद कर रहे हैं? यदि आप इसे सहेजते हैं और इसे वापस लोड करते हैं, तो क्या आप स्मृति के बाहर नहीं होंगे जैसा आप शुरू करना चाहते हैं? –

+1

इस विशेष मामले में, मैं इसे किसी अन्य मशीन (अधिक मेमोरी के साथ) में स्थानांतरित करने के लिए इसे स्थानांतरित कर दूंगा और या तो इसे टुकड़े टुकड़े को वापस लिखूंगा या इसे सीधे डेटाबेस में लोड कर दूंगा। स्पष्ट रूप से टिकाऊ नहीं है, लेकिन मैं केवल एक बार स्टॉपगैप समाधान की तलाश में हूं। – Shahin

उत्तर

3

और भी बहुत कुछ आप एक चल रहे प्रोग्राम के लिए क्या कर सकते हैं नहीं है। एकमात्र चीज जिसे मैं सोच सकता हूं वह है जीडीबी डीबगर संलग्न करना, प्रक्रिया को रोकना और स्मृति की जांच करना। वैकल्पिक रूप से सुनिश्चित करें कि कोर सिस्टम को बचाने के लिए आपका सिस्टम सेट अप किया गया है, फिर kill --sigsegv <pid> के साथ प्रक्रिया को मार दें। इसके बाद आपको कोर डंप को जीडीबी के साथ खोलने और अपने अवकाश पर इसकी जांच करने में सक्षम होना चाहिए।

कुछ जीडीबी मैक्रोज़ हैं जो आपको पाइथन डेटा संरचनाओं की जांच करने और जीडीबी के भीतर से पाइथन कोड निष्पादित करने देंगे, लेकिन इन कामों के लिए आपको डिबग प्रतीकों के साथ संकलित पायथन स्थापित करने की आवश्यकता है और मुझे संदेह है कि यह आपका मामला है। पहले कोर डंप बनाना, फिर प्रतीकों के साथ अजगर को पुन: सम्मिलित करना काम नहीं करेगा, क्योंकि सभी पते डंप में मानों से बदल जाएंगे।

http://wiki.python.org/moin/DebuggingWithGdb

http://chrismiles.livejournal.com/20226.html

या 'अजगर gdb'

N.B. के लिए गूगल:

यहाँ gdb से अजगर आत्मनिरीक्षण लिए कुछ लिंक हैं coredumps बनाने के लिए linux सेट करने के लिए ulimit कमांड का उपयोग करें।

ulimit -a आपको दिखाएगा कि वर्तमान सीमाएं क्या निर्धारित हैं।

ulimit -c unlimited किसी भी आकार के कोर डंप को सक्षम करेगा।

+0

बहुत बुरा। यह आमतौर पर अधिक उपयोगी लगता है, हालांकि, मैं इसे एक शॉट दूंगा। विस्तृत प्रतिक्रिया के लिए धन्यवाद। – Shahin

0

+1 बहुत ही रोचक सवाल।

मुझे नहीं पता कि यह आपके लिए कितना अच्छा काम कर सकता है (विशेष रूप से जब से मुझे नहीं पता कि आप प्रोग्राम में मसालेदार सूची का पुन: उपयोग करेंगे), लेकिन मैं यह सुझाव दूंगा: जैसा कि आप डिस्क पर लिखते हैं, प्रिंट करते हैं STDOUT की सूची बाहर। जब आप अपने अजगर स्क्रिप्ट चलाने (मैं कमांड लाइन से भी अनुमान लगा रहा हूँ), इसलिए की तरह एक फाइल करने के लिए संलग्न करने के लिए उत्पादन अनुप्रेषित:

python myScript.py >> logFile. 

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

आशा इस मदद करता है

1

जबकि निश्चित रूप से बहुत सुंदर नहीं है, आप proc फाइल सिस्टम के माध्यम से अपनी प्रक्रिया के डेटा तक पहुंचने का प्रयास कर सकते हैं ../proc/[pid-of-your-process]। Proc फाइल सिस्टम कई प्रक्रियाओं की जानकारी संग्रहीत करता है जैसे कि वर्तमान में खुले फ़ाइल पॉइंटर्स, मेमोरी मैप्स और क्या नहीं। खुदाई के साथ आप जो डेटा चाहते हैं उसे एक्सेस करने में सक्षम हो सकते हैं।

फिर भी मुझे संदेह है कि आपको इसे पाइथन के भीतर से देखना चाहिए और कुछ रनटाइम लॉगिंग & डिबगिंग करना चाहिए।

0

This answer में एक पाइथन प्रक्रिया में gdb को जोड़ने पर जानकारी है, मैक्रोज़ के साथ जो आपको उस प्रक्रिया में pdb सत्र में ले जाएगा। मैंने खुद कोशिश नहीं की है लेकिन इसे 20 वोट मिले हैं। लगता है जैसे आप ऐप को लटकाना बंद कर सकते हैं, लेकिन यह भी आपके मामले में जोखिम के लायक है।

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