清空列表后dict的Python列表未释放内存

时间:2018-10-05 06:38:11

标签: python multithreading list dictionary memory-management

我有一个python脚本,其中有一个全局变量object_list

我开始5个并行线程,调用一个函数从SQS中读取objects并追加到同一列表中。如下所示:-

object_list = []
def operate(obj_array):
    for obj in obj_array:
        # some calculation.
        # obj is of type dict.
        obj.clear()
    # either i can clear each object in the for loop or delete the obj_array at the end.
    del obj_array

def append_to_list(sqs):
    global object_list
    object_list.append(sqs)
    if len(object_list) > 100:
        o = Thread(target=operate, args=(object_list,))
        o.start()
        object_list = []

def object_reader(process_number):
    print process_number
    for msg in queue.get_messages():
        obj = json.loads(msg.get_body())
        t = Thread(target=append_to_list, args=(obj,))
        t.start()

for x in xrange(5):
    t = Thread(target=object_reader, args=(x,))
    t.start()

如上面的代码所示,我希望程序启动5个线程以从SQS中读取并将对象附加到一个全局列表中。

一旦列表长度超过100,我想在另一个线程中对该列表进行操作,并且还要使全局列表为空以重复相同的内容。

问题是我的程序以无限循环(24x7)运行,但是脚本内存不断增加并超过了容器限制,这导致容器被杀死。

我不知道为什么内存超过100时会不断增加,因为我要清空全局列表。

1 个答案:

答案 0 :(得分:0)

您可能对名称为object_list的对象有悬空的引用,因此该对象永远不会被垃圾回收。

执行object_list = []会将新的空列表分配给全局名称object_list,但不会修改该名称所指向的现有列表对象(可能是悬挂的)。

您可能想使用分片分配就地清除整个列表:

object_list[:] = []