Java矩阵处理时间

Java矩阵处理时间,java,matrix,sparse-matrix,matrix-multiplication,Java,Matrix,Sparse Matrix,Matrix Multiplication,我需要所有大师的简单意见 我开发了一个程序来做一些矩阵计算。这一切都很好用 小矩阵。然而,当我开始计算大千列行矩阵时。信息技术 扼杀速度 我想对每一行进行处理,并将结果写入一个文件,然后释放 内存并开始处理第二行并写入文件,依此类推 这有助于提高速度吗?我必须做出重大改变来实施这一改变。那是 为什么我需要你的意见。你觉得怎么样 谢谢 我知道colt和Jama matrix的事。由于公司原因,我不能使用这些软件包 规则 编辑 在我的程序中,我将所有矩阵存储在二维数组中,如果矩阵很小,就可以了。但

我需要所有大师的简单意见

我开发了一个程序来做一些矩阵计算。这一切都很好用 小矩阵。然而,当我开始计算大千列行矩阵时。信息技术 扼杀速度

我想对每一行进行处理,并将结果写入一个文件,然后释放 内存并开始处理第二行并写入文件,依此类推

这有助于提高速度吗?我必须做出重大改变来实施这一改变。那是 为什么我需要你的意见。你觉得怎么样

谢谢

我知道colt和Jama matrix的事。由于公司原因,我不能使用这些软件包 规则


编辑
在我的程序中,我将所有矩阵存储在二维数组中,如果矩阵很小,就可以了。但是,当它有数千列和数千行时。然后将所有这些矩阵存储在内存中进行计算会导致性能问题。矩阵包含浮点值。为了进行处理,我读取了存储在内存中的所有矩阵,然后开始计算。计算后,我将结果写入文件。

内存真的是你的瓶颈吗?因为如果不是这样,那么停下来把东西写进文件总是比另一种方法慢得多。听起来您可能正在经历算法的某些限制

也许你应该考虑首先优化算法。< /P>


正如我经常说的,对于所有的性能问题,询问别人是一回事,但没有什么可以代替尝试!如果真实世界的性能是可测量的,意见无关紧要。

我建议在代码中使用分析工具和计时语句,在开始进行更改之前,准确地找出性能问题所在

你可以花很长时间“修复”一些不是问题的东西。我怀疑您建议的文件IO实际上会降低代码的速度

如果您的代码有效地在另一个循环中嵌套了一个循环来处理每个元素,那么当您增加矩阵的大小时,您将看到速度迅速下降。如果是这样的话,一个需要考虑的领域就是并行处理您的数据,允许您的代码利用多个CPU/内核


考虑更有效地实现稀疏矩阵数据结构,而不是多维数组(如果您现在正在使用多维数组)

使用JDK中jvisualvm中的探查器来确定时间花在哪里


我会做一些简单的实验来确定你的算法是如何伸缩的,因为听起来你可能会使用比你想象的运行时复杂度更高的算法。如果它以N^3的形式运行(如果要将列表与数组相乘,这是很常见的),那么将输入大小加倍将使运行时间加倍。

您需要记住,执行NxN乘以NxN需要2xN^3的计算。即便如此,也不需要几个小时。你应该通过转置第二个矩阵(大约30%)来得到改善,但这真的不应该需要几个小时

因此,当你增加2x N时,时间就增加了8x。更糟糕的是,适合缓存的矩阵速度非常快,但mroe比几MB还要快,而且它们必须来自主内存,这将使您的操作速度再降低2-5倍

把数据放在磁盘上真的会减慢你的计算速度,我只建议你在martix不适合内存的情况下这样做,但它会使它慢10-100倍,所以多买一点内存是个好主意。(在你的情况下,你的矩阵应该足够小,可以放入内存中)

我尝试了Jama,这是一个非常基本的库,它使用二维数组而不是一维数组,在4年的labtop上花了7分钟。通过使用最新的硬件和多线程,您应该能够在一分钟内完成一半的时间


编辑:使用Xeon X5570,Jama在156秒内乘以两个5000x5000矩阵。使用我编写的并行实现,将此时间缩短到27秒。

除了其他人所说的,您可以在这里描述您的算法,看看是否可以改进。最有可能的是算法本身是瓶颈。面对Java不适合数值演算这一事实。使用另一个适合您需要的工具。谢谢您的快速回答。我已经检查过了,这是导致性能问题的矩阵计算。在我的程序中,我将所有矩阵存储在二维数组中,如果矩阵很小,就可以了。但是,当它有数千列和数千行时。然后将所有这些矩阵存储在内存中进行计算会导致性能问题。还有其他想法吗?我认为你无法推断性能问题与内存有关。假设有一个5000x5000的double矩阵,double在JVM上使用8个字节。将整个矩阵存储在内存中需要消耗200000000字节,约190MB,在现代计算机上并不多。您可以使用jconsole之类的工具来查看JVM中分配了哪些内存,以及何时(关键是)正在运行垃圾收集。这意味着许多元素都是零。如果将矩阵存储为二维数组,并且大多数元素为零,那么考虑另一种实现,避免存储(和处理)空元素。也许存储每个元素坐标的非空元素列表可以节省大量内存,让您的处理速度更快。谢谢您的回答:)。如果要将5000x5000矩阵与另一个5000x5000矩阵合并,它将消耗多少内存和cpu?:)我在做乘法运算,我有6GB的RAM和core2du,处理它需要几个小时:(Java是一个严格的要求吗?这听起来像是一个使用专用数学程序的好主意(比如Mathematica)嗨,Peter,非常感谢。只是为了我自己的实验。我还下载了jama并使用7000X4000矩阵,只是为了在我的机器上执行SVD计算。这花费了几分钟,并给出了堆大小错误。我只是使用