我正在与Jama Matrix合作。我把它用于LSI。它工作得很好。然而,当我通过像8000x8000这样的大矩阵时,它会杀死我的整个系统。我只是调用SVD然后减少矩阵大小并加起来。没有其他的 !
有什么想法吗?我该如何解决这个问题?
core2du
Ram = 10GB
Java运行时设置
-Xmx5000M
执行Jama矩阵代码
时,没有其他程序正在运行答案 0 :(得分:2)
我也使用Jama进行SVD,并且在解决大矩阵时遇到同样的问题。 为了减少内存溢出情况,我调整了SingularValueDecomposition.java来压缩一个。调整是在矩阵A中它具有如此多的0(零)值,因此所使用的所有矩阵(例如A,U,V,Work等)的压缩仅允许存储器获得大于0的可用值。 在使用紧凑型SVD之前,您应该制作一个矩阵文件 r / t c / t值/ n r / t c / t值/ n ...'/ t'和'/ n'分别表示制表符和新行。
例子,(0,0,0),(0,1,0.5),(0,2,0),(0,3,0.2),(1,0,1),(1,1, 0),(1,2,0),(1,3,0.3)和矩阵大小是2 * 4(R * C)然后你就像文件一样 MATRIXSIZE / t 2 / t 4 / n 0 / t 1 / t 0.5 / n 0 / t 3 / t 0.2 / n 1 / t 0 / t 1 / n 1 / t 3 / t 0.3 / n
如果您想使用它,请将您的电子邮件地址(mg.hwang@gmail.com)告诉我。 我将提供更多细节,以便在电子邮件中使用它。
我检查结果是对的。但是,我不确定这对计算机有多大效果。 无论如何,即使不是很多,它也会起作用并表现得更好。
答案 1 :(得分:1)
你可能面临内存不足的情况。您可能希望使用-Xmx选项增加JVM可用的内存,例如-Xm256m将为您的JVM提供256 MB,而不是默认的64 MB。
您还可以考虑使用替代库来处理内存有效的矩阵表示,使用稀疏矩阵模型(如COO,DOK,CSR等)...查看维基百科条目“稀疏矩阵”以获取更多详细信息。
This thread为贾马提供了几种选择,也许这对你也有所帮助。
答案 2 :(得分:0)
这是一个指数大问题。毕竟计算8000 X 8000矩阵的SVD并不是一块蛋糕,因为你说的是64,000,000个元素!
如果您使用:
运行JAMA MagicSquareExample 32x32矩阵经过时间为0.062秒。
64x64将上升至0.0328秒
96x96将在1.891秒内经过
128x128在4.5秒内160x160在11.109秒
192x192 in 24.063 sec
224x224 in 46.063 sec
256x256 in 83.625 sec
512x512 in 1716.719 sec
答案 3 :(得分:0)
如果您正在进行LSI,那么您可以进行两项重要的优化。首先,您的矩阵是稀疏的(假设您使用的是逐个文档矩阵)。 JAMA在密集矩阵上运行,因此您可能希望寻找不同的表示。正如Lolo所说,这将大大减少您的开销。
其次,LSI仅需要计算前k个奇异向量。 JAMA计算所有奇异值,这在您的情况下是不必要的。此外,如果您只需要k最大,则可以通过使用具有显着更低内存开销的thin-SVD进一步优化。对于大型文档集合来说,计算LSI的完整SVD几乎是不可能的,因此如果要扩展,最终必须从JAMA以外的其他方式切换。
SVDLIBJ是在Java中执行thin-SVD的一种可能性。 S-Space Package还有一个SVDLIBJ包装器和命令行工具,如果你想避免完全写LSI,还有一个LSI / LSA实现。