如何避免NumPy+MKL的四行内存泄漏?

7 投票
1 回答
723 浏览
提问于 2025-04-17 17:48

以下这段简单的四行代码在我的 Python 2.6.6 / NumPy 1.7.0 / MKL 10.3.6 环境中会导致内存泄漏:

import numpy as np

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

每次运行这个代码,使用的内存都会增加一个 10x10 矩阵的大小。不过,当我使用 NumPy 1.4.1/ATLAS 环境时,就没有这种情况。

我听说 MKL 不一定会自动释放内存,所以我猜这就是内存不断增加的原因。有没有简单的方法可以修改 NumPy(在编译之前或之后),让这段四行代码正常工作呢?

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 个回答

8

这确实是NumPy的一个bug,已经被发现几个月了,大家在这里讨论过;这个问题会在1.7.1版本中修复。修复的内容是这个简单的一行代码,放在item_selection.c文件里。加上这一行代码并重新编译后,一切就正常了。

撰写回答