[英]Memory leak(?) Python 3.2
嗨,我是python的新手,我已经阅读了特定主题的足够帖子,但没有一个具体的答案。 (使用py 64位3.2版)
我有一个很大的输入,我在循环中读取它,当我读取文件时,我创建了我追加到List的组。 我处理List然后将其存储在文件中。 我没有看到List(List = None),我将其删除。 我甚至手动调用gc收集器。 问题是仍然使用了内存。 交换空间和拉姆狂野。
for line in file: # read line by line
temp_buffer = line.split() # split elements
for word in temp_buffer: #enumerate (?)
if not l1: # list is empty
l1.append(str(word)) #store '-' to list
else: # list is not empty
tempp = l1.pop(0)
l1.insert(0,"-0")
l1.sort(key=int)
l2 = term_compress(l1)
l1 = None # delete referrences
del l1 # delete struct
print(" ".join(str(i) for i in l2) , file=testfile) # print for every term in file
l2 = None # delete referrences
del l2 # delete struct
gc.collect() # run garbagge collector (free RAM)
l1 = []
l2 = []
l1.append(str(word))
我究竟做错了什么 ?
编辑
示例输入:
-a 1 2 3 4 5 6 7 8 9 10
-n 7 8 9 10 11 12 13 14 15 ...
产量
-a 1# 10#
-n 7# 15#
传统意义上的编程错误很可能不是内存/参考泄漏。 您可能会看到的是底层C运行时积极地保留Python在循环期间代表您分配的堆内存。 预计您可能需要再次使用该内存。 保持它比将其返回到OS内核只是一次又一次地要求它便宜。
因此,简而言之,即使您的对象在Python运行时中被垃圾收集, 底层C运行时也会挂起到堆内存,以防程序再次需要它。
从glibc文档:
有时,free实际上可以将内存返回给操作系统并使进程变小。 通常,它所能做的就是允许稍后调用malloc来重用该空间。 与此同时,空间仍然作为malloc内部使用的自由列表的一部分保留在程序中。
从这个意义上讲,操作系统在循环后报告的内存利用率基本上就是“峰值内存利用率”。 如果您认为它太高,那么您必须考虑重新设计程序以限制其峰值内存使用量。 这通常使用某种流式传输或缓冲设计来完成,您可以一次在较小的数据块上进行操作。
免责声明,以上是一个外行的版本,显然是针对各种Python,C和操作系统的特定实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.