2012-06-14 28 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进行调查的软件包。