Python列表太大,无法';不能删除

Python列表太大,无法';不能删除,python,python-2.7,numpy,Python,Python 2.7,Numpy,我有一个迭代器/生成器,可以生成“事件”。事件由名称、时间戳和值组成。我想把它们存储在NumPy数组中。 这是在\u LoadTriples()中完成的。: def\u加载三元组(abortEvt,count=[1]): 它=_YieldTriples() 尽管如此: 如果abortEvt.is_set(): it.close() 打破 t0=时间。时间() self.allEvents.append(np.fromiter)(it, 数据类型=[('sigNameIdx','i'), ('ti

我有一个迭代器/生成器,可以生成“事件”。事件由名称、时间戳和值组成。我想把它们存储在NumPy数组中。 这是在
\u LoadTriples()中完成的。

def\u加载三元组(abortEvt,count=[1]):
它=_YieldTriples()
尽管如此:
如果abortEvt.is_set():
it.close()
打破
t0=时间。时间()
self.allEvents.append(np.fromiter)(it,
数据类型=[('sigNameIdx','i'),
('time','f'),
('value','f8')],
计数=计数[-1]))
dur=time.time()-t0
如果dur<0.2:
count.append(count[-1]*2)
elif dur>0.4,计数[-1]!=1:
count.append(count[-1]/2)
其他:
count.append(count[-1])
\u YieldTriples
是生成器,
abortEvt
是当用户中止迭代时通知我的事件
self.allEvents
是一个空列表。在这里,我想用三元组
(名称、时间戳、值)附加NumPy数组。
这是一个数组列表,因为我想有可能中断迭代,而不能中断
NumPy.fromiter
。所以每0.3秒我就可以停止迭代

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

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

还有一件事需要提及:函数被称为新的
线程。线程
,但主线程等待它

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

您应该尝试:

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

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

我不确定问题是什么,但您使用的是可变默认参数。您在此处对
count
所做的任何更改都将永久保留在您的程序中(除非您使用某种技巧来更改该行为)。定义“使用过的”python通常不会返回内存,而是在获得内存后将其回收。@mgilson:问题是分配的内存太多,我无法释放它。在我的程序中调用了一些函数之后,我得到了MemoryError。。。是的,它是可变的,这不是我的意图,但也没关系,见下文。@seberg:当我删除列表时,它应该会把内存还给我。。。但它不会,内存会一直使用到程序结束,你知道这是因为。。。?删除后再次运行,看看内存是否进一步增加。是的,你完全正确,这不是很聪明。事实上,我的程序中没有任何默认参数,我只是把它放在那里,你可以看到,
count
是一个以1开始/结束的列表。。。但这与我的记忆问题无关
def _LoadTriples(abortEvt, count=None):
    if count is None:
        count = [1]
    ...