2017-10-01 168 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位运行,我会试试这:) –