我正在计算一个线性系统Ax = b的解决方案,其中A具有一个大的(通常200,000行和相关的密集矩阵的列)稀疏矩阵和ba稀疏矩阵,大约100列。
当我在Windows系统上运行代码(Python2.7,scipy0.14.0)时,以下命令
fromscipy.sparse.linalgimportspsolve...Temp=spsolve(A.tocsc(),b.tocsc())
运行平稳,需要大约7 GB的内存。
在Linux系统上以完全相同的矩阵(完全相同的CPU,相同的RAM内存:64 GB,Linux Mint17.3,python2.7,scipy0.13.3)运行完全相同的代码需要超过20 GB的内存,并且崩溃以下错误消息:
failed with UMFPACK_ERROR_out_of_memory(参见1)
因为此错误是依赖于操作系统的,我排除了关于矩阵的任何问题,一个和b(与所提到的一些解决方案,在这个岗位),以及我试图找到一个解决具体到Linux ...但我不知道从哪里开始...有人会对发生的事情有任何想法吗?以及为什么这样的问题特定于Linux系统?
请在下面找到完整的错误消息:
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1489, in __call__
return self.func(*args)
File "...", line 1533, in mmvConstruction
...
File "...", line 1555, in modes_cb
Temp = spsolve(k[inter][:,inter].tocsc(),k[inter][:,exter].tocsc())
File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/linsolve.py", line 151, in spsolve
Afactsolve = factorized(A)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/linsolve.py", line 352, in factorized
umf.numeric(A)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/umfpack/umfpack.py", line 450, in numeric
umfStatus[status]))
RuntimeError: failed with UMFPACK_ERROR_out_of_memory
更新:仍在尝试寻找解决方案...看来Linux Mint上BLAS的最新版本相当老:1.8.2。在Windows上,我使用BLAS 1.9.1。使用test_numpy.py此处提供的文件时:https://gist.github.com/osdf/3842524#file-test_numpy-py我注意到Linux和Windows之间存在非常显着的差异:Linux:版本1.8.2,maxint 9223372036854775807,点:0.76 s -视窗:版本1.9.1,MAXINT 2147483647,点:0037秒。我正在研究Linux上的OPENBLAS是否可以解决此问题...
更新2:我意识到问题可能与硬件有关。确实,一台旧的PC在相同的Linux Mint发行版(Rosa 17.3)上具有完全相同的库,可以提供令人满意的结果。第一次更新中提到的基准在此旧PC上提供了:Linux:版本1.8.2,maxint 9223372036854775807,点:0,054 s。
解决方案
好了,经过深入的研究,我现在确信我遇到的问题与以下事实有关:Linux Mint(Rosa 17.3)可能未针对最新处理器进行优化。
我在帖子更新中提到的比较结果强调该软件安装正确。然后,我在PC上安装了Fedora 23,并按顺序安装:
libblas
蟒蛇
python-scipy
然后,我使用完全相同的矩阵运行了完全相同的代码,并且没有任何问题:RAM消耗限制为大约7 GB,这与Windows系统上观察到的情况类似。