scipy 的冰中出现 SIGSEV 故障

SIGSEV fault in scipy's eigh

我在使用 scipy 的 linalg.eigh 对角化矩阵时遇到 'SIGSEGV' 错误问题。

以下代码在 for 循环的几次迭代后重现了该问题:

import scipy.sparse as sparse
import scipy.linalg as linalg

a = sparse.random(128, 128, 0.8)
b = sparse.random(128, 128, 0.8)*1j
a = a + b
a = a + a.H

for i in range(0, 100):
        E, R = linalg.eigh(a.todense())

单步调试后,似乎scipy调用LAPACK时出现故障,但我不确定我能做些什么来阻止这种情况的发生。

我是运行python3.7,在macOS Catalina下使用scipy1.2.1

如有任何帮助,我们将不胜感激。

问题与并非所有用于 ER 的内存都被释放以及每次迭代都会创建新的 ER 数组有关。在循环末尾插入 gc.collect() 也不能解决这个问题。在每次迭代结束后删除 ER,或者确保在每次迭代中不为 ER 创建新的数组副本可以解决问题,如中所示两个代码片段:

#manually delete E and R at the end of each iteration
import scipy.sparse as sparse
import scipy.linalg as linalg

a = sparse.random(128, 128, 0.8)
b = sparse.random(128, 128, 0.8)*1j
a = a + b
a = a + a.H

for i in range(0, 100):
        E, R = linalg.eigh(a.todense())
        del(E)
        del(R)
#create E and R before the loop and store eigenpairs directly into these arrays
import scipy.sparse as sparse
import scipy.linalg as linalg
import numpy as np

a = sparse.random(128, 128, 0.8)
b = sparse.random(128, 128, 0.8)*1j
a = a + b
a = a + a.H

E = np.empty(128, np.float)
R = np.empty((128, 128), np.complex)

for i in range(0, 100):
        E[:], R[:][:] = linalg.eigh(a.todense())