使用Struct和Numpy的Python内存泄漏

使用Struct和Numpy的Python内存泄漏,python,numpy,memory-leaks,struct,Python,Numpy,Memory Leaks,Struct,但继续使用正确说明问题的示例代码 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==')

但继续使用正确说明问题的示例代码

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
为什么使用的内存不断增加?为什么即使在删除变量后,脚本末尾仍会使用这么多内存?谢谢。

这个链接非常有用。问题在于结构模块缓存格式字符串。如果我显式地创建一个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: ')