Pythonlist太大,无法删除

2024-09-30 02:29:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个迭代器/生成器,它产生“事件”。事件由名称、时间戳和值组成。我想把它们存储在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是一个空列表。这里我想用三元组来附加NumPy数组(name, timestamp, value).这是一个数组列表,因为我想有可能中断迭代,而且我不能中断numpy.fromiter。所以每隔0.3秒我就可以停止迭代。在

一切都很好。但是,在一个例子中,Python很快就为列表占用了300MB内存!当我停止迭代时,我的列表最多只需要10MB,这取决于我何时停止它,但是在使用了几个调用self.allEvents.append(np.fromiter(...))300MB之后,我完全不知道为什么。在

此外,除非我停止整个程序,否则这个内存不会被释放,即使我在调用该函数后直接删除self.allEvents。一定有一些参考资料阻止我发布它。有没有方法可以查看哪些对象引用了列表?在

还有一件事需要提到:函数被称为一个新的threading.Thread,但是主线程等待它。。。在

编辑:我没有提到,一旦300MB被使用,就不会随着列表的增长而分配更多的内存。似乎这个列表在一些附录之后保留了这个内存。在


Tags: 内存selfnumpy列表timecount事件it

热门问题