Python:修改大对象列表后的空闲内存

时间:2014-10-03 22:46:31

标签: python memory-management garbage-collection

我有一个包含单个类中的大对象的大型列表:

my_list = [ LargeClass() for i in xrange(10000)]

我需要将列表的一部分复制到一个辅助列表中,但是为了节省内存,我想在原始列表中用一堆替换那个片段:

new_list = my_list[:1000]
my_list[:1000] = [None] * 1000

我希望这会减少'my_list'使用的内存,所以我不带两个相同“数据”的副本。但是,这不会释放任何内存。调用垃圾收集器也没有任何区别。

有没有办法实现这个目标?

编辑:我应该提到第二个列表将作为参数传递给子进程(多处理),因此它将被复制。完成后,我不需要原始列表中的数据,这只是浪费内存。

2 个答案:

答案 0 :(得分:2)

正如罗杰所说,你实际上并没有复制对象,而是复制了引用:

In [27]: mylist = [object() for i in range(10000)]

In [28]: newlist = mylist[:1000]

In [29]: mylist[0] is newlist[0]
Out[29]: True

is检查对象是否相同(不仅仅是相同的,而是相同的

如果要销毁对象,则需要删除对它们的所有引用;哪个(不是你想做的,但是)可以通过简单说明来完成:

mylist = mylist[:1000]

总而言之,我从来没有表现出需要使用Python的GC。对象足够小,我不在乎,或者如果它们是大规模(数百MB),那么它们似乎在短时间内被清除。 我的"问题"垃圾收集通常是我的代码中的问题,我有一个偷偷摸摸的参考,我没有清理。

答案 1 :(得分:0)

正如评论所说,你不能通过更改标签来释放内存,这样你就可以更好地删除你不想要的索引:

my_list[:1000] = []