繁体   English   中英

内存泄漏(?)Python 3.2

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM