问题描述
在我的代码中,我在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
如您所见,删除列表后,我仍然没有清除所有内存。我运行的属性越多,迭代次数越多,最终的内存值就越多。我想完成删除我创建的所有对象的操作,该怎么做?
解决方法
我想完成删除我创建的所有对象的操作,怎么办?
您做到了。您甚至不需要使用del
(del
所做的只是删除 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完全控制的事情,而且我怀疑很多时候您甚至无法通过汇编来实现。不用担心操作系统比您更了解如何为进程分配内存。这就是为什么您的计算机上只有一台。