Python列表太大,无法删除

时间:2013-06-20 15:51:43

标签: python python-2.7 numpy

我有一个产生'事件'的迭代器/生成器。事件由名称,时间戳和值组成。我想将它们存储在NumPy数组中。 这是在_LoadTriples()

中完成的
def _LoadTriples(abortEvt, count=[1]):
    it = _YieldTriples()
    while True:
        if abortEvt.is_set():
            it.close()
            break
        t0 = time.time()
        self.allEvents.append(np.fromiter(it,
                                      dtype=[('sigNameIdx', 'i'),
                                             ('time', 'f'),
                                             ('value', 'f8')],
                                      count=count[-1]))
        dur = time.time() - t0
        if dur < 0.2:
            count.append(count[-1]*2)
        elif dur > 0.4 and count[-1] != 1:
            count.append(count[-1]/2)
        else:
            count.append(count[-1])

_YieldTriples是生成器,abortEvt是告诉我用户何时中止迭代的事件。 self.allEvents是一个空列表。在这里,我想用三元组(name, timestamp, value).附加NumPy数组。这是一个数组列表,因为我希望有可能打破迭代,我不能打破numpy.fromiter。所以每隔约0.3秒我就可以停止迭代了。

一切正常。 但是,在一个例子中,它发生了Python快速耗尽300MB内存的列表!当我停止迭代时,我的列表只需要最多10 MB,具体取决于我何时停止它,但是在使用了几次self.allEvents.append(np.fromiter(...)) 300MB之后,我完全不知道为什么。

此外,在我停止整个程序之前,即使我在调用该函数后直接删除self.allEvents,也不会释放此内存。必须有一些参考文献阻止我释放它。有没有办法看到哪些对象引用了列表?

还有一件事要提到:该函数被称为新threading.Thread,但是mainthread等待它...

编辑:我没有提及,一旦300MB正在使用,随着列表增长,不再分配内存。似乎该列表在一些附加后保留了这个记忆。

1 个答案:

答案 0 :(得分:2)

你应该尝试:

def _LoadTriples(abortEvt, count=None):
    if count is None:
        count = [1]
    ...

可变的默认参数可能会导致问题非常快。