对象没有被完全删除

时间:2020-09-10 01:39:10

标签: python class object memory

在我的代码中,我在for循环内创建了一个对象列表。像这样的东西:(get_size函数是从这里获得的:https://jsfiddle.net/1j4rwsvc/2/

def mem_now():
    mem = psutil.Process(os.getpid()).memory_info()
    mem = mem[0]/(1024.**2)
    return mem

class lista():
    def __init__(self, val):
        self.x = val
        self.y = val**2
        self.z = val - 1

intlst = []
objlst = []

for i in range(int(1e5)):
    g = lista(i)
    objlst.append(g)
    intlst.append(g.z)

print 'int_list_size = {:.2f} Mb'.format(get_size(intlst)/1e6)
print 'obj_list_size = {:.2f} Mb'.format(get_size(objlst)/1e6)

print 'mem_now (no del) = {:.2f} Mb'.format(mem_now())

del intlst

print 'mem_now (del int) = {:.2f} Mb'.format(mem_now())

del objlst

print 'mem_now (del obj) = {:.2f} Mb'.format(mem_now())

,输出如下:

mem_now = 45.11 Mb

int_list_size = 3.22 Mb
obj_list_size = 43.22 Mb

mem_now (no del) = 103.35 Mb
mem_now (del int) = 103.35 Mb
mem_now (del obj) = 69.10 Mb

如您所见,删除列表后,我仍然没有清除所有内存。我运行的属性越多,迭代次数越多,最终的内存值就越多。我想完成删除我创建的所有对象的操作,该怎么做?

1 个答案:

答案 0 :(得分:1)

我想完成删除我创建的所有对象的操作,怎么办?

您做到了。您甚至不需要使用deldel所做的只是删除 reference ;当存在以下情况时,将清理基础 object 不再引用它。

考虑一个更简单的示例:

def alloc():
    global x
    x = list(range(1000000))

for i in range(1000):
    alloc()

我们反复从头开始创建列表。即使我们没有采取任何措施来“删除”先前迭代中的列表(您也不需要这样做,并且不应尝试),我们也不会耗尽内存-因为清理是自动的。 (如果实际上确实用完了内存,Python将为失败的分配引发MemoryError。)x大约需要36兆字节才能在我的系统上表示(列表为8,整数为28)。 ;我没有36 GB的RAM,但是没有问题。这只需要一点时间(在我的系统上大约需要19秒)。内存使用率不会随着时间的推移而上升。

然后我del x时,系统上进程内存使用率(任务管理器报告)迅速下降。但是,这就是问题:它可能无法始终如一地,或者根本没有,或者没有立即这样做,或者可能取决于您使用哪种工具进行检查。这可能取决于您的操作系统和其他平台的详细信息。无论如何,这不是您梦dream以求的从Python完全控制的事情,而且我怀疑很多时候您甚至无法通过汇编来实现。不用担心操作系统比您更了解如何为进程分配内存。这就是为什么您的计算机上只有一台。