2014-12-02 54 views
2

继续Python Memory Leak Using binascii, zlib, struct, and numpy但示例代码正确说明了我有问题。Python内存泄漏结构和Numpy

import struct 
import zlib 
import binascii 
import numpy as np 
import os 
import psutil 
import gc 

l = list() 
l.append('eJztwYEAAAAAw6D5U1/gCFUB' + 'A'*161 + 'McA6vIAAQ==') 
l.append('eJztwYEAAAAAw6D5U1/hAFUB' + 'A'*3957 + 'HwGw6IAAQ==') 
l.append('eJztwYEAAAAAw6D5U1/hAFUB' + 'A'*3957 + 'LwGw6QAAQ==') 

process = psutil.Process(os.getpid()) 
for s in l: 
    print (process.get_memory_info()[0]/float(2 ** 20)) 
    byte_array = zlib.decompress(binascii.a2b_base64(s)) 
    array = np.array(struct.unpack('%dB' % (len(byte_array)), byte_array)) 
    del byte_array 
    del array 
    gc.collect() 
    print (process.get_memory_info()[0]/float(2 ** 20)) 

del l 
del s 
gc.collect() 
print (process.get_memory_info()[0]/float(2 ** 20)) 

它打印:

22.37109375 
25.83203125 
25.83203125 
95.65625 
95.65625 
166.69140625 
166.69140625 

为什么使用的内存不断增加?为什么即使在变量被删除之后脚本末尾仍会使用太多内存?谢谢。

回答

2

此链接http://bugs.python.org/issue14596是非常有帮助的。这个问题与结构模块缓存格式字符串有关。如果我明确创建一个Struct对象,请使用它,然后将其删除,问题消失。

import struct 
import zlib 
import binascii 
import os 
import psutil 
import gc 


def print_memory(string): 
    print string + str(process.get_memory_info()[0]/float(2 ** 20)) 

l = list() 
l.append('eJztwYEAAAAAw6D5U1/gCFUB' + 'A'*161 + 'McA6vIAAQ==') 
l.append('eJztwYEAAAAAw6D5U1/hAFUB' + 'A'*3957 + 'HwGw6IAAQ==') 
l.append('eJztwYEAAAAAw6D5U1/hAFUB' + 'A'*3957 + 'LwGw6QAAQ==') 

process = psutil.Process(os.getpid()) 
for s in l: 
    print_memory('Before inflating: ') 
    byte_array = zlib.decompress(binascii.a2b_base64(s)) 
    _struct = struct.Struct('%dB' % (len(byte_array))) 
    array = _struct.unpack(byte_array) 
    del byte_array 
    del array 
    del _struct 
    gc.collect() 
    print_memory('After inflating and deleting: ') 

del l 
del s 
gc.collect() 
print_memory('After deleting everything: ')