Python Memory Leak mit Struct und Numpy

Fortsetzung von Python Memory Leak Mit binascii, zlib, struct und numpy aber mit Beispiel Code, der korrekt illustriert das Problem habe ich.

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)) 

Es druckt:

  • Gedächtnisverlust mit Pandas dataframe
  •  22.37109375 25.83203125 25.83203125 95.65625 95.65625 166.69140625 166.69140625 

    Warum wird das Gedächtnis weiter erhöht? Warum wird so viel Speicher am Ende des Skripts verwendet, auch nachdem die Variablen gelöscht wurden? Vielen Dank.

  • Python: Wann sollte ich jemals file.read () oder file.readlines () verwenden?
  • Überraschende Ergebnisse mit Python timeit: Counter () vs defaultdict () vs dict ()
  • Messen Sie die Zeit in Python?
  • NameError zur Verwendung von Timeit in Python
  • Erstellen einer leeren Liste in Python
  • Messen Sie die Zeit einer Funktion mit Argumenten in Python
  • One Solution collect form web for “Python Memory Leak mit Struct und Numpy”

    Dieser Link http://bugs.python.org/issue14596 war sehr hilfreich. Das Problem war mit dem Strukturmodul Caching Format Strings. Wenn ich explizit ein Struct-Objekt erstellen, benutze es und löschst es dann das Problem geht weg.

     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: ') 
    Python ist die beste Programmiersprache der Welt.