我正在計算一個線性系統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系統上觀察到的情況類似。