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
如有任何帮助,我们将不胜感激。
问题与并非所有用于 E
和 R
的内存都被释放以及每次迭代都会创建新的 E
和 R
数组有关。在循环末尾插入 gc.collect()
也不能解决这个问题。在每次迭代结束后删除 E
和 R
,或者确保在每次迭代中不为 E
和 R
创建新的数组副本可以解决问题,如中所示两个代码片段:
#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())
我在使用 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
如有任何帮助,我们将不胜感激。
问题与并非所有用于 E
和 R
的内存都被释放以及每次迭代都会创建新的 E
和 R
数组有关。在循环末尾插入 gc.collect()
也不能解决这个问题。在每次迭代结束后删除 E
和 R
,或者确保在每次迭代中不为 E
和 R
创建新的数组副本可以解决问题,如中所示两个代码片段:
#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())