2012-06-14 51 views
2

我在寫一個關於圖像處理的程序。我需要存儲一個大小爲480 000列和480 000行的int方陣。任何想法我怎麼能做到這一點?如何在C++中存儲大型矩陣

+5

第一步是購買858GB的RAM。 –

+0

問題已被問:http://stackoverflow.com/questions/1788942/how-to-create-a-2000020000-matrix-in-c –

+0

@Bo:在這個問題中,矩陣可以放入RAM中。所以我不認爲這個問題是那個問題的重複。 –

回答

4

不要使用480,000×480,000矩陣。

這個完整矩陣(假設它不是稀疏的)的唯一理由是隨機訪問(即能夠隨時訪問任何元素)。即使你能以某種方式實現這一目標(存儲0.9Tb),數據訪問將是非常緩慢,讓你的算法效率低(當映射到文件特別是)。

相反,想想一種重寫你的算法的方法,它不需要隨機訪問整個矩陣,但可能只有它的一小部分,你創建(然後刪除),或者需要減少存儲這些數據的任何其他方式。

高性能不僅僅是減少計算量,而且關鍵還在於減少隨機數據訪問。

3

您可以將它存儲在一個文件中,並將需要的矩陣部分映射到內存中。見例如http://en.wikipedia.org/wiki/Memory-mapped_file

+0

只需通過映射文件爲矩陣分配內存。使用WinApi:http://msdn.microsoft.com/en-us/library/windows/desktop/aa366556(v=vs.85).aspx或POSIX:http://ru.wikipedia.org/wiki/Mmap – k06a

+0

http://stackoverflow.com/questions/11028478/linux-large-int-array-mmap-vs-seek-file –

+0

@ k06a這將只在他有64位機器時才起作用。和一個非常大的磁盤有很大的可用空間。所需的總大小與Terabyte差不多。 –

3

如果您需要同時處理整個矩陣,並且大部分矩陣元素將變爲空白,那麼您應該考慮使用某種數據結構。許多線性代數庫支持稀疏矩陣(Boost.uBlasEigen等),以及一些圖像處理庫(OpenCV等)。

1

這取決於特徵矩陣都會有。

將它有大量的0?如果是這樣,你可以使用稀疏矩陣實現,它不存儲0。

如果它是一個帶狀矩陣可以存儲只是斜角帶。

您必須查看矩陣屬性並查看可以節省內存的位置。如果您找不到允許進行此類優化的任何屬性,那麼您將不得不將其存儲在文件中。

0

如果它是一個稀疏矩陣,你需要對此做一些線性代數,我會使用一些科學線性代數庫,如Trilinos(使用Epetra或Tpetra包)或Hypre。這些是高度並行的庫(如果你可以並行運行你的代碼,這很好)。我從來沒有使用Hypre(儘管我聽說比Trilinos有更好的表現),所以我不能告訴你任何關於它的事情。 Trilinos是一個巨大的(我會說太大)的圖書館,大約有50-60個包,它不是很容易學習;但如果你必須處理巨大的矩陣,那麼依靠經過充分測試和開發的一些TPL是有意義的。 對於只是矩陣存儲,Epetra/Tpetra是在Trilinos進行調查的軟件包。