2010-08-10 67 views
3

因此,當我試圖聲明大於10000x10000的矩陣時,我發現Eigen程序包崩潰。我需要像這樣聲明一個矩陣。大約13000x13000元素可靠。我跑了一個測試,如:32位應用程序的Eigen最大矩陣大小

for(int tortureEigen = 1 ; tortureEigen < 50000 ; tortureEigen++) 
{ 
    printf("Torturing Eigen with %dx%d..\n", tortureEigen, tortureEigen) ; 
    Eigen::MatrixXd m(tortureEigen, tortureEigen) ; 
} 

崩潰在我的機器(6 GB RAM)14008元素。

我有點失望!我認爲Eigen就像MATLAB或八度,不應該使用更大的陣列,即使它碰到磁盤或其他東西也不會崩潰。

更重要的是,當我運行此測試並保持TaskMan打開時,創建的過程這些矩陣甚至沒有使用那麼多的內存。 TaskMan報告使用2k以下。

使用本徵2.0.15穩定釋放

+2

你有沒有得到任何錯誤消息,隨着這次崩潰?你是否可以將其陷入調試器?如果我們有更多的信息,我們可能會提供幫助。 OTOH,我的直覺說這是Eigen郵件列表的問題。 – 2010-08-10 13:43:18

+0

崩潰發生在'_aligned_malloc'在本徵分配代碼(MatrixXd :: resize())中返回0 0 – bobobobo 2010-08-14 16:30:30

回答

4

這裏的所有答案都有幫助!

事實證明,編譯32位應用程序時,將本徵如果你嘗試,並聲明dense MatrixXd崩潰,因爲我是,大於14000元左右。崩潰發生在_aligned_malloc在Eigen分配代碼(MatrixXd :: resize())中返回0,這意味着1.5GB的連續對齊的RAM不能在32位下分配,這是合理的,因爲這接近於一半最大可尋址內存loc。發現超過1.5 GB連續出來的4.0變得不太可能,我想!不幸升級到Eigen 3.0 並沒有解決問題

解決方案#1

那麼好了,我在64位編譯,和我的6GB的機器上,該程序成功運行,與密集MatrixXd分配和解決方案的工作就好了。

溶液#2

另一種解決方案是使用DynamicSparseMatrix<double>。稀疏不會在巨大的大小分配上崩潰,即使是32位應用程序,但API解決方案的支持是另一回事(API似乎想要轉換爲MatrixXd密集型以便解決,這留下了我們相同的原始問題。)

+0

,4GB虛擬地址空間分爲兩部分,一半用於內核,另一半用於用戶模式應用程序(除非您使用/ 3GB開關,這給你一個額外的演出)。所以在1.5GB的情況下,你已經接近2GB的極限了。請記住,對於密集矩陣,您需要連續的內存塊,並且隨着進程加載的其他模塊和共享庫在進一步對地址空間進行碎片化時對您起作用。這是一個有趣的閱讀:http://blogs.technet.com/b/markrussinovich/archive/2008/11/17/3155406.aspx – Amro 2013-08-23 22:07:36

1

出了本徵文檔的:

密還是稀疏: 該矩陣類處理致密,不稀疏矩陣和向量。對於稀疏矩陣和向量,請參閱稀疏模塊。
密集矩陣和矢量是普通的係數陣列。所有的係數都存儲在一個普通的連續數組中。這不同於稀疏矩陣和向量,其中係數被存儲爲非零係數的列表。

讓我們看看,10000x10000x8(雙矩陣)約1.5GB。人們會預料到,在32位操作系統下連續堆塊的最大大小。嘗試稀疏矩陣。

如果你真的需要這麼大的密集矩陣,那麼你還有其他一些問題:計算會在下次停電之前結束嗎?

+0

我必須在這裏瘋狂,但10000 * 10000 * 8字節= 762.9 MB。 但是在14000處,它對應於1.5GB – 2010-08-10 14:47:03

+0

dat chu,你是對的。用14000計算並寫入10000,哦我的 – 2010-08-10 17:29:39

1

鑑於您的硬件規格,我只能假設您正在64位操作系統上運行。

即使內存被分頁到頁面文件,您仍然可能會崩潰。這可能意味着內存碎片化,或者您的頁面文件太小。如果是這樣,你應該將你的頁面文件變成8或12GB左右的大文件。

+0

我說內存碎片不太可能。將64位地址空間嚴重碎片化並不容易,因此沒有連續的1.5 GB塊是空閒的。 – Niki 2010-08-10 14:22:49

+0

你可能沒錯。儘管如此,它的可能性很小。但更可能的是分頁文件太小。 – 2010-08-15 01:51:25

5

eigen developer here。在我們的支持渠道上詢問Eigen問題會更好。論壇... ;-)

簡答:你使用固定或動態大小的矩陣?

  • 如果固定大小,切換到動態尺寸(對於如此巨大的規模,這是一個沒有腦子反正)

  • 如果你得到錯誤的動態大小的矩陣,我我驚訝地發現,但同時我可以看到10000的值來自哪裏。無論如何,如果你升級到eigen3(開發分支),你的問題就會消失。

+0

感謝您的註冊!不幸的是,這並不適用於我 - 在Windows 32位上看到我的迴應低於 – bobobobo 2010-08-14 16:30:02