相关疑难解决方法(0)

Python内存泄漏

我有一个长时间运行的脚本,如果让它运行得足够长,将消耗我系统上的所有内存.

没有详细介绍脚本,我有两个问题:

  1. 是否有任何"最佳实践"可以帮助防止泄漏发生?
  2. 有哪些技术可以调试Python中的内存泄漏?

python debugging memory-leaks memory-management

164
推荐指数
7
解决办法
13万
查看次数

通过id()获取对象?

假设我有一个Python对象的id,我通过这个来检索它id(thing).如何thing通过我给出的身份证号码再次找到?

python

114
推荐指数
5
解决办法
7万
查看次数

跟踪Python中的内存泄漏(多处理)

我有一个multiprocessing泄漏内存的应用程序.但是,泄漏不是主要过程(根据Dowsertop),而是在子过程中.有什么办法可以在子过程中使用Dowser(或类似的工具)来追踪泄漏吗?如果没有,它如何追踪它?

更新:我花了很多时间尝试使用heapygnibbler的代码,但我无法找到泄漏.然后我在主过程中停止了cherpy并在子进程中启动了另一个(使用Dowser).但几分钟后,CherryPy就会停止收听端口... :(所以我仍然在寻找更好的主意.

python memory-leaks multiprocessing

14
推荐指数
1
解决办法
3449
查看次数

从调试器打印python中的所有可用元组

我意识到一个python脚本中存在内存泄漏.首先占用25MB左右,15天后占用超过500MB.

我遵循了许多不同的方式,并没有能够成为问题的根源,因为我是一个蟒蛇新手......

最后,我得到了以下内容

objgraph.show_most_common_types(limit=20)
tuple                      37674
function                   9156
dict                       3935
list                       1646
wrapper_descriptor         1468
weakref                    888
builtin_function_or_method 874
classobj                   684
method_descriptor          551
type                       533
instance                   483
Kind                       470
getset_descriptor          404
ImmNodeSet                 362
module                     342
IdentitySetMulti           333
PartRow                    331
member_descriptor          264
cell                       185
FontEntry                  170
Run Code Online (Sandbox Code Playgroud)

我设定了一个断点,在每次迭代之后,这就是正在发生的事情......

objgraph.show_growth()
tuple    37674       +10
Run Code Online (Sandbox Code Playgroud)

什么是最好的方法?

(Pdb) c
(Pdb) objgraph.show_growth()
tuple    37684       +10
Run Code Online (Sandbox Code Playgroud)

我想打印出所有的元组,并交叉检查 - 每次添加10个元组会给我一些线索吗?请告诉我如何做到这一点..

或者有没有其他方法来找出这个内存泄漏.我使用python 2.4.3,并且由于许多其他产品依赖 - 不幸的是我不能/不应该升级.

python memory-leaks

8
推荐指数
1
解决办法
636
查看次数

关于字典和列表的python内存回收

最近,我对python的内存管理感到困惑.首先是关于dict,比如说我有一个复合词典对象

d = {id1: {'x': 'a', 'y': [1,2,3], 'z': {'k', 'v'}}, id2: {...}}
Run Code Online (Sandbox Code Playgroud)

如果我打电话给del,

del d[id1]
Run Code Online (Sandbox Code Playgroud)

d [id1] ['y']和d [id1] ['z']会一起回收吗?

第二是关于列表,我从这里读了答案,所以我尝试了.这是我的代码

import sys
import gc
import time
from collections import defaultdict 
from pprint import pprint 

def f():
    d = defaultdict(int) 
    objects = gc.get_objects() 
    for o in objects: 
        d[type(o)] += 1
    x = d.items()
    x = sorted(x, key=lambda i: i[1], reverse=True)
    pprint(x[:5]) 

def loop():
    while True:
        leaked = [[x] for x in range(100)]
        f()
        time.sleep(0.1)
Run Code Online (Sandbox Code Playgroud)

当范围是100时,好吧,函数f确实显示我的列表正在增加,但是当我将范围修改为1000时,没有什么可以改变,列表的数量保持不变.谁能告诉我这是什么问题?

python memory

1
推荐指数
1
解决办法
139
查看次数