0

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

我开发了一个程序来做一些矩阵计算。它适用于小矩阵。但是,当我开始计算大千列行矩阵时。它杀死了速度。

我正在考虑对每一行进行处理并将结果写入文件中,然后释放内存并开始处理第二行并写入文件,依此类推。

对提高速度有帮助吗?我必须做出很大的改变来实现这个改变。这就是为什么我需要你的意见。你怎么看?

谢谢

PS:我知道 colt 和 Jama 矩阵。由于公司规定,我不能使用这些包。


已编辑

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

4

4 回答 4

3

内存真的是你的瓶颈吗?因为如果不是这样,那么停止将内容写入文件总是会比替代方案慢得多。听起来您可能遇到了算法的一些限制。

也许您应该首先考虑优化算法。

正如我一直对所有性能问题所说的那样 - 询问人们是一回事,但没有什么可以替代尝试!如果现实世界的表现是可衡量的,意见并不重要。

于 2010-08-27T23:23:34.337 回答
2

我建议在您的代码中使用分析工具和时序语句来准确计算出您的性能问题在您开始进行更改之前的位置。

您可能会花很长时间“修复”不是问题的东西。我怀疑您建议的文件 IO 实际上会减慢您的代码速度。

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

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

于 2010-08-27T23:24:17.523 回答
2

您需要记住,执行 NxN 乘以 NxN 需要 2xN^3 次计算。即便如此,它也不应该花费数小时。您应该通过转置第二个矩阵(大约 30%)来获得改进,但它确实不应该花费数小时。

因此,当您将 N 增加 2 倍时,您会将时间增加 8 倍。更糟糕的是,适合您的缓存的矩阵非常快,但小于几 MB,并且它们必须来自主内存,这会使您的操作再减慢 2-5 倍。

将数据放在磁盘上确实会减慢您的计算速度,我只建议您在 martix 不适合内存时这样做,但它会使其慢 10 倍 - 100 倍,因此购买更多内存是个好主意。(在您的情况下,您的矩阵应该足够小以适合内存)

我尝试了 Jama,这是一个非常基本的库,它使用二维数组而不是一维数组,并且在 4 岁的 labtop 上花了 7 分钟。只需使用最新的硬件并使用多线程将其缩短到一分钟以下,您应该能够获得一半的时间。

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

于 2010-08-28T07:28:56.833 回答
1

使用 JDK 中 jvisualvm 中的分析器来确定时间花在哪里。

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

于 2010-08-28T06:27:52.373 回答