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:

 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.

  • Rückkehr von C ++ - DLL zu Python
  • Python ctypes pragma pack für Byte ausgerichtet lesen
  • Java-Äquivalent von Python's struct.pack?
  • Auspacken von verschachtelten C-Strukturen in Python
  • Packung 4 Integers als ONE BYTE?
  • Python, wie man Daten in einem in einer Liste gespeicherten namedtuple bearbeiten kann?
  • Python-Klasse-Fabrik, um einfache strukturelle Klassen zu produzieren
  • Python struct.pack () für einzelne Elemente in einer Liste?
  • 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.