Python Memory Leak 的延续 使用 binascii、zlib、struct 和 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
为什么使用的内存继续增加? 为什么即使在删除变量后,脚本末尾仍使用如此多的内存? 谢谢。
这个链接 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: ')