我正在开发一个需要处理非常大的矩阵的Java应用程序,例如两个1000万 * 1000万的矩阵相乘!当然,Java堆内存不足以存储其中任何一个矩阵。
那我该怎么办呢?
我应该使用数据库来存储我的矩阵,并且每次只将需要的部分加载到内存中,逐个部分进行乘法运算吗?
有很多众所周知的方法可以并行化矩阵乘法(基本上是将各种大小的子矩阵相乘,然后组合结果),并通过围绕填充曲线而不是行/列排列来组织数据以使访问模式具有合理的高速缓存局部性。您肯定会想要查看经典的LAPACK接口和设计,Intel的MKL,GotoBLAS作为调整为特定现代硬件的BLAS函数的实现,之后您可能会进入未开发的领域 :-)
考虑使用类似http://hsqldb.org/的内存数据库。
由于这是一个非常庞大的计算,我认为您在处理存储问题时可能会遇到性能问题。因此,我建议您考虑并行化解决方案,并让多台机器/核心处理数据的子集。
幸运的是,矩阵乘法解决方案会自然分解。但我建议您考虑一些形式的网格或分布式计算解决方案。
根据你的数据使用任何适用于稀疏矩阵的算法。(假设你没有2.4 PB的磁盘空间来存储3个10^8个方形非稀疏矩阵,更不用说那么多的RAM用于内存数据库 - Blue Gene/Q只有1.6 PB。)
如果你被迫使用Java,而无法编写处理此类问题的本地方法(即通过告诉Java调用一些C代码来处理),那么最有效的做法可能是使用一个简单的二进制文件。在这种情况下,我会避免使用数据库,因为它们比直接文件访问慢,并且你不需要它们提供的功能。