我有一個python腳本正在處理大量來自壓縮的ASCII數據。經過一段時間後,它會耗盡內存。我沒有構建大型列表或者字典。下面的代碼說明問題:Python內存泄漏使用binascii,zlib,結構和numpy
import struct
import zlib
import binascii
import numpy as np
import psutil
import os
import gc
process = psutil.Process(os.getpid())
n = 1000000
compressed_data = binascii.b2a_base64(bytearray(zlib.compress(struct.pack('%dB' % n, *np.random.random(n))))).rstrip()
print 'Memory before entering the loop is %d MB' % (process.get_memory_info()[0]/float(2 ** 20))
for i in xrange(2):
print 'Memory before iteration %d is %d MB' % (i, process.get_memory_info()[0]/float(2 ** 20))
byte_array = zlib.decompress(binascii.a2b_base64(compressed_data))
a = np.array(struct.unpack('%dB' % (len(byte_array)), byte_array))
gc.collect()
gc.collect()
print 'Memory after last iteration is %d MB' % (process.get_memory_info()[0]/float(2 ** 20))
它打印:
Memory before entering the loop is 45 MB
Memory before iteration 0 is 45 MB
Memory before iteration 1 is 51 MB
Memory after last iteration is 51 MB
第一和第二次迭代之間,獲得創建6 MB的內存。如果我運行循環兩次以上,內存使用率保持在51 MB。如果我將代碼解壓縮到自己的函數中,並將實際的壓縮數據提供給它,內存使用量將繼續增長。我正在使用Python 2.7。爲什麼記憶力在增加,如何糾正?謝謝。
我不會說,那是內存泄漏,這是正常的內存消耗。 – Daniel 2014-12-01 20:47:19
除了看起來很正常,就像@Daniel說的那樣,'byte_array'和'a = np.array'怎麼樣?在實例化它們之前,您的第一次迭代會輸出內存使用情況*。這聽起來像很多數據,這可能不會被垃圾收集器破壞,因爲你在'for'循環範圍內調用它。 Unindent(向左移動)表示'gc。collect()'所以它在'for'循環之外運行,看看會發生什麼。 – BorrajaX 2014-12-01 20:49:55
@BorrajaX在最後一次打印之前和循環退出之後添加了另一個gc.collect,沒有任何變化。對於所有打印語句,byte_array和「a」變量不應該存在於內存中 – user2133814 2014-12-01 20:55:04