2017-10-01 165 views
-1

我是一種新的python,我需要整天運行腳本。然而,腳本使用的內存不斷增加,直到蟒蛇崩潰...我試過的東西,但沒有任何工作:(也許我做錯了什麼,我不知道。這是我的代碼是這樣的:如何在python中釋放內存?

while True: 
    try: 

    import functions and modules... 
    Init_Variables = ... 
    def a bunch of functions... 

    def clearall(): #Function to free memory 
     all = [var for var in globals() if var[0] != "_" and var != gc] 
     for var in all: 
      del globals()[var] 
     print('Cleared !') 
     gc.collect() 
     TimeLoop() #Getting out of "try" here because TimeLoop isn't defined anymore    

    def TimeLoop(): 

     for i in range (1,101):  
      do stuff... 

     # Free memory after 100 iterations ############################# 
     clearall() 

    TimeLoop() # Launches my function when i first start the script 

    except Exception as e: 
    print(e) 
    continue 
    break 

經過約50.000迭代「做的東西......」 Python使用約2GB的RAM,然後崩潰:( 我花了幾個小時試圖解決這個問題,但似乎沒有任何工作。任何幫助將是非常讚賞!:D

+0

很有可能不是連續運行相同的腳本,而是最好設置一個cronjob來間隔運行腳本。 – JJJ

+0

就像運行X分鐘的腳本,然後殺死並重新啓動它?這種殘酷但應該工作^^'。但是我想找到一個更柔和的工作哈哈:) –

+0

編號運行腳本,讓它完成,然後重新運行一分鐘後。 – JJJ

回答

0

Python只要沒有對對象的引用就自動釋放內存,你不應該試圖自己釋放內存,你似乎使用遞歸調用,這意味着每次迭代中的每個變量都是保存在內存。最佳做法是,只使用局部變量,保持函數簡短,避免遞歸,不要使用循環引用。

所以,你的腳本應該是簡單的:

import functions and modules... 
# no global variables 
def a bunch of functions... 

def main(): 
    while True:  
     call_function_to_do_stuff() 
     # python frees memory automatically after each function call 

if __name__ == '__main__': 
    main() # Launches my function when i first start the script 
+0

這正是它以前的樣子,但我有這個記憶問題。這就是爲什麼我做了這個clearall()函數和while循環。我向循環網站提出了幾個請求,但我得到的答案似乎無限存儲。我不明白我怎麼可以做出這些請求沒有遞歸調用:( –

+0

那麼你應該作爲一個問題與真正的問題。 – Daniel

0

使用python64,經過時間量X傾倒大量的數據變量爲null。我最近設法使用8gb ram和python64工作正常

+0

我真的在32位運行,我會試試這:) –