2013-03-03 9 views
7

Der folgende einfache vierzeilige Code erzeugt in meinem Python ein Speicherleck 2.6.6/1.7.0 NumPy/MKL 10.3.6 Setup:Wie vermeidet man dieses vierzeilige Speicherleck mit NumPy + MKL?

import numpy as np 

t = np.random.rand(10,10) 
while True: 
    t = t/np.trace(t) 

Mit jedem Betrieb, der verwendete Speicher von der Größe wächst von eine 10x10-Matrix. Allerdings gibt es kein solches Verhalten, wenn ich ein NumPy 1.4.1/ATLAS-Setup verwende.

Ich habe gelesen, dass MKL den Speicher nicht unbedingt automatisch freigibt, also denke ich, dass dies der Grund für den Blowup ist. Gibt es eine einfache Möglichkeit, NumPy (vor oder nach dem Kompilieren) zu modifizieren, so dass dieser Vierliner gut funktioniert?

Ausgabe von np.show_config()

numpy 1.7.0 

lapack_opt_info: 
    libraries = ['mkl_rt', 'pthread'] 
    library_dirs = ['$MKLPATH/lib/intel64'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['$MKLPATH/include'] 
blas_opt_info: 
    libraries = ['mkl_rt', 'pthread'] 
    library_dirs = ['$MKLPATH/lib/intel64'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['$MKLPATH/include'] 
lapack_mkl_info: 
    libraries = ['mkl_rt', 'pthread'] 
    library_dirs = ['$MKLPATH/lib/intel64'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['$MKLPATH/include'] 
blas_mkl_info: 
    libraries = ['mkl_rt', 'pthread'] 
    library_dirs = ['$MKLPATH/lib/intel64'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['$MKLPATH/include'] 
mkl_info: 
    libraries = ['mkl_rt', 'pthread'] 
    library_dirs = ['$MKLPATH/lib/intel64'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['$MKLPATH/include'] 
+1

Das sieht definitiv wie ein Bug in numpy. Vielleicht haben Sie mehr Glück, wenn Sie sich an ihren Bugtracker wenden oder numpy 1.8 ausprobieren? – entropy

+1

Interessanterweise passiert der Effekt immer noch mit 'gc.collect' in der Schleife ([gc - garbage collection] (http://docs.python.org/2/library/gc.html)), was auf einen numpigen Bug hinweist. Vielleicht lohnt es sich, auf ihrem Problem Tracker zu erhöhen? – danodonovan

+0

Danke, ich habe dieses Problem an den numpy Bug Tracker übermittelt. Ich werde diese Frage schließen, sobald ich dort eine positive Antwort bekomme. –

Antwort

8

Dies ist in der Tat ein NumPy Bug, der seit einigen Monaten bekannt ist und hat here diskutiert worden; es wird in 1.7.1 behoben sein. Die Lösung ist this nice one-liner in item_selection.c. Nach dem Hinzufügen dieser Zeile und dem erneuten Kompilieren funktioniert alles einwandfrei.

Verwandte Themen