2013-03-03 8 views
7

Il seguente semplice codice a quattro linea produce una perdita di memoria nel mio Python 2.6.6/NumPy 1.7.0/MKL 10.3.6 configurazione:Come evitare questa perdita di memoria a quattro righe con NumPy + MKL?

import numpy as np 

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

Ad ogni operazione, la memoria utilizzata cresce di dimensione una matrice 10x10. Tuttavia, non esiste un comportamento simile quando utilizzo una configurazione NumPy 1.4.1/ATLAS.

Ho letto che MKL non necessariamente libera automaticamente la memoria, quindi immagino che questo sia il motivo dello scoppio. C'è un modo semplice per modificare NumPy (prima o dopo la compilazione), in modo che questo quadrante funzioni bene?

uscita di 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

Che sembra decisamente un insetto in numpy. Forse avrai più fortuna ad inviare il bug tracker o provare a provare a numpy 1.8? – entropy

+1

è interessante notare che l'effetto si verifica ancora con 'gc.collect' nel ciclo ([gc - garbage collection] (http://docs.python.org/2/library/gc.html)) che punta a un bug insensato. Forse vale la pena aumentare sul tracker dei problemi? – danodonovan

+0

Grazie, ho inviato questo problema al tracker insetto numpy. Chiuderò questa domanda non appena avrò una risposta positiva lì. –

risposta

8

Questo è davvero un errore NumPy, che è noto da alcuni mesi ed è stato discusso here; sarà corretto in 1.7.1. La correzione è this nice one-liner in item_selection.c. Dopo aver aggiunto questa riga e ricompilato, tutto funziona correttamente.