Python-list太大,无法删除

标签 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 是一个空列表。在这里,我想在 NumPy 数组中附加三元组 (name, timestamp, value)。 它是一个数组列表,因为我希望有可能中断迭代并且我不能中断 numpy.fromiter。所以每隔大约 0.3 秒我就可以停止迭代。

一切正常。 但是,在一个示例中,Python 很快就用完了列表的 300MB 内存!当我停止迭代时,我的列表最多只需要 10 MB,具体取决于我停止它的时间,但在对 self.allEvents.append(np.fromiter(...)) 进行几次调用之后,需要 300MB用过,但我完全不知道为什么。

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

还有一件事要提:该函数作为新的 threading.Thread 被调用,但主线程等待它......

编辑:我没有提到,一旦使用了 300MB,随着列表的增长,不再分配更多的内存。看起来列表在添加一些内容后保留了这个内存。

最佳答案

你应该尝试:

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

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

关于Python-list太大,无法删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17218225/

相关文章:

python - 与 python 模型相比,tensorflow lite 模型给出了非常不同的精度值

python - 组合两个numpy数组以形成一个数组,每个数组中的最大值

Python(17874,0x111e92dc0)malloc : can't allocate region

python - 获取 pandas HDF5 查询中的最后一行

python - 如何在数据框中添加和重命名(无标题)列

python - Django相关模型无法解析

python-2.7 - 更改python中时间戳的格式

python - 使用 Beautifulsoup for XML 在一个级别上获取标签名称

python - 使用 numpy 随机选择条目的快速方法

python - 在 Pyplot 中,一旦绘图已经绘制完成,我们如何更改绘图的线宽?