2012-09-05 10 views
14

मेरे पास एक जटिल पायथन सर्वर ऐप है, जो लगातार हर समय चलता है। नीचे इसका एक बहुत ही सरल संस्करण है।पिल्ला स्मृति उपयोग हमेशा के लिए बढ़ता है?

जब मैं पाइथन का उपयोग करके नीचे दिए गए ऐप को चलाता हूं; "पायथन मेन.py"। यह सीधे 8 एमबी रैम का उपयोग करता है, और राम के 8 एमबी पर रहता है, जैसा कि इसे करना चाहिए।

जब मैं इसे "pypy Main.py" का उपयोग करके चलाता हूं। यह 22 एमबी रैम का उपयोग करके शुरू होता है और समय के साथ राम उपयोग बढ़ता है। 30 सेकंड के बाद 50 एमबी के बाद, एक घंटे के बाद 60 एमबी पर।

यदि मैं "b.something()" को "पास" करने के लिए बदलता हूं तो यह स्मृति की तरह गड़बड़ नहीं करता है।

मैं ओएसएक्स 10.7.4 पर पाइप 1.9 का उपयोग कर रहा हूं, मैं अजगर के साथ अधिक रैम का उपयोग कर पाइप के साथ ठीक हूं।

क्या लंबे समय तक स्मृति खाने से पिटाई रोकने का कोई तरीका है?

import sys 
import time 
import traceback 

class Box(object): 
    def __init__(self): 
     self.counter = 0 
    def something(self): 
     self.counter += 1 
     if self.counter > 100: 
      self.counter = 0 

try: 
    print 'starting...' 
    boxes = []  
    for i in range(10000): 
     boxes.append(Box()) 
    print 'running!' 
    while True: 
     for b in boxes: 
      b.something() 
     time.sleep(0.02) 

except KeyboardInterrupt: 
    print '' 
    print '####################################' 
    print 'KeyboardInterrupt Exception' 
    sys.exit(1) 

except Exception as e: 
    print '' 
    print '####################################' 
    print 'Main Level Exception: %s' % e 
    print traceback.format_exc() 
    sys.exit(1) 

नीचे और समय की एक सूची उस समय राम उपयोग है (मैं इसे रात में चल छोड़ दिया)।

Wed Sep 5 22:57:54 2012, 22mb ram 
Wed Sep 5 22:57:54 2012, 23mb ram 
Wed Sep 5 22:57:56 2012, 24mb ram 
Wed Sep 5 22:57:56 2012, 25mb ram 
Wed Sep 5 22:57:58 2012, 26mb ram 
Wed Sep 5 22:57:58 2012, 27mb ram 
Wed Sep 5 22:57:59 2012, 29mb ram 
Wed Sep 5 22:57:59 2012, 30mb ram 
Wed Sep 5 22:58:00 2012, 31mb ram 
Wed Sep 5 22:58:02 2012, 32mb ram 
Wed Sep 5 22:58:03 2012, 33mb ram 
Wed Sep 5 22:58:05 2012, 34mb ram 
Wed Sep 5 22:58:08 2012, 35mb ram 
Wed Sep 5 22:58:10 2012, 36mb ram 
Wed Sep 5 22:58:12 2012, 38mb ram 
Wed Sep 5 22:58:13 2012, 39mb ram 
Wed Sep 5 22:58:16 2012, 40mb ram 
Wed Sep 5 22:58:19 2012, 41mb ram 
Wed Sep 5 22:58:21 2012, 42mb ram 
Wed Sep 5 22:58:23 2012, 43mb ram 
Wed Sep 5 22:58:26 2012, 44mb ram 
Wed Sep 5 22:58:28 2012, 45mb ram 
Wed Sep 5 22:58:31 2012, 46mb ram 
Wed Sep 5 22:58:33 2012, 47mb ram 
Wed Sep 5 22:58:35 2012, 49mb ram 
Wed Sep 5 22:58:35 2012, 50mb ram 
Wed Sep 5 22:58:36 2012, 51mb ram 
Wed Sep 5 22:58:36 2012, 52mb ram 
Wed Sep 5 22:58:37 2012, 54mb ram 
Wed Sep 5 22:59:41 2012, 55mb ram 
Wed Sep 5 22:59:45 2012, 56mb ram 
Wed Sep 5 22:59:45 2012, 57mb ram 
Wed Sep 5 23:00:58 2012, 58mb ram 
Wed Sep 5 23:02:20 2012, 59mb ram 
Wed Sep 5 23:02:20 2012, 60mb ram 
Wed Sep 5 23:02:27 2012, 61mb ram 
Thu Sep 6 00:18:00 2012, 62mb ram 
+1

हम्म को कैसे ट्विक करें। मैं इसे पुन: उत्पन्न नहीं कर सकता। पपी 1.9 (मैकपोर्ट्स से) और ओएस एक्स 10.6.8 के साथ, मुझे स्मृति उपयोग (जैसा कि 'शीर्ष' द्वारा रिपोर्ट किया गया है, आरएसआईजेई कॉलम से) लगभग 46 एम पर रहता है। यह एक बग रिपोर्ट के लायक हो सकता है। –

+0

मुझे अभी भी उस प्रक्रिया को चल रहा है, इसके लिए नया डेटा पॉइंट: गुरु सितम्बर 6 9:02:26 2012, 63 एमबी रैम – DavidColquhoun

+2

मैं इसे 1.yy का उपयोग करके पुन: उत्पन्न कर सकता हूं, लेकिन 1.9 ने इस समस्या को सही किया है – goncalopp

उत्तर

10
+0

ओह, गलत जवाब पर टिप्पणी की, मेरी टिप्पणी उपरोक्त उत्तर में ले जाया गया। – DavidColquhoun

+2

4 महीने बाद और मुझे एहसास हुआ कि रोनी ने जो भी जुड़ा हुआ है वह एक बेहतर समाधान है। 1 और 3 जीबी के बीच राम उपयोग को रखते हुए, PYPY_GC_MIN = 1GB और PYPY_GC_MAX = 3GB सेट करना बहुत बेहतर काम करता है। और मैंने पाया कि gc.collect() कॉल लगभग 50ms ले रहे थे ... मेरे आवेदन को बहुत धीमा कर दिया। तो हाँ, उन पर्यावरण चर जाने के लिए एक बेहतर तरीका है। :) – DavidColquhoun

+0

@DavidColquhoun जो 'PYPY_GC_MIN = 1GB' और' PYPY_GC_MAX = 3GB' है, 'PYPY_GC_MIN = "1GB" 'और' PYPY_GC_MAX = "3GB" 'सही नहीं है? –

5

CPython की तुलना में, PyPy different garbage collection strategies उपयोग करता है। यदि स्मृति में वृद्धि आपके प्रोग्राम में कुछ के कारण है, तो आप gc मॉड्यूल से collect फ़ंक्शन का उपयोग करके, अब और उसके बाद एक मजबूर कचरा संग्रह चलाने की कोशिश कर सकते हैं। इस मामले में, यह स्पष्ट रूप से del बड़ी ऑब्जेक्ट्स को भी मदद कर सकता है जिनकी आपको अब आवश्यकता नहीं है और यह दायरे से बाहर नहीं निकलता है।

यदि यह पिल्ला की आंतरिक कार्यप्रणाली के कारण है, तो यह एक बग रिपोर्ट सबमिट करने के लायक हो सकता है, क्योंकि मार्क डिकिंसन ने सुझाव दिया था।

+0

धन्यवाद! gc.collect() वह था जो मुझे चाहिए था। मैं हर कुछ सेकंड चलाता हूं और यह मेमोरी उपयोग को सपाट रखता है ... एक कमांड को देखने के लिए ग्राफ को यहां देखें: http://datasmugglers.com/2012/10/06/server-ram-usage/ – DavidColquhoun

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