码迷,mamicode.com
首页 > 编程语言 > 详细

python内存泄漏

时间:2019-09-13 15:47:34      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:注意   value   不重启   glob   with open   global   添加   number   运行   

如果你的程序是死循环,不停歇的代码,下列是需要注意内存的问题。
第一、pillow库的隐患

#内存将发生泄漏
from PIL import  Image

im = Image.open(‘1.jpg‘)
im.save()

#使用with使程序更安全
from PIL import  Image

with open(‘1.jpg‘ , ‘rb‘) as open_file:
    im = Image.open(open_file)

第二、使用importlib.reload重载模块后带来使用全局变量带来的隐患
假如采取不重启程序方式,自动重新载入修改后的文件,所以需要进行重载模块

#run.py
import importlib

while True:
    module_name = importlib.import_module(‘.‘, ‘test_file‘)
    module_name = importlib.reload(module_name)
    result = module_name.main(params)

#test_file.py
global_value = {‘dataList‘:[],
                ‘number‘:‘‘,}
key = ‘初始值‘

def main(params):

    # params携带着此次任务数据

    global_value[‘number‘] = params[‘number‘]
    get_data1(params)
    get_data2(params)
    return global_value

def get_data1(params):
    global key
    # 你的程序通过params得到新的数据
    data_once = {‘每次运行产生的键‘: ‘每次运行产生的键值‘}
    key = ‘新值‘
    global_value[‘dataList‘].append(data_once)

def get_data2(params):
    # 你的程序通过params和key新的值,得到另一份数据
    data_once = {‘每次运行产生的新键‘: ‘每次运行产生的新键值‘}
    global_value[‘dataList‘].append(data_once)

上述就会发生一种隐患,以前我觉得垃圾回收机制很靠谱。但是当每一次重载模块时,global_value将使用新的地址,原来的地址还放着上一次的数据,没有被释放掉
就算你在每次循环里添加gc.collect()也不能快速回收删除上一次的数据,导致内存持续增长。。。


我的处理方式是
(1)将global_value这个转移进函数内,通过传参将get_data1和get_data2数据整合在一个变量里
(2)将所有函数放在一个类中,也可以避免全局变量数据存活时间太长


总结,虽然使用全局变量很省事,不用传参,其他函数改变其值再被其他函数调用很方便,却会导致内存泄漏,因为每一次reload时产生的是新的内存地址。

python内存泄漏

标签:注意   value   不重启   glob   with open   global   添加   number   运行   

原文地址:https://www.cnblogs.com/7134g/p/11516818.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!