当您需要更多Java堆空间时,您会怎么做?

时间:2012-08-06 17:39:42

标签: java linear-algebra

很抱歉,如果之前已经问过这个问题(虽然我找不到解决办法)。

我不太擅长编程,但无论如何,我正在抓取一堆网站并在服务器上存储有关它们的信息。我需要一个java程序来处理与每个文档相关联的矢量坐标(大约十亿个左右的文档,总共500,000个数字,加上或减去,与每个文档相关联)。我需要计算整个矩阵的奇异值分解。

现在,Java显然无法像我所知那样处理矩阵。如果我尝试制作一个相对较小的阵列(约4400万大),那么我将得到一个堆错误。我使用eclipse,所以我尝试将-xmx值更改为1024m(即使我有一台8gb ram的计算机,它也不会因为某些原因而变得更高)。

这有什么解决方案?检索我需要的数据的另一种方法是什么?以不同的方式计算SVD?使用不同的编程语言来做到这一点?

编辑:就目前而言,假装有十亿个条目,每个条目与3个字相关联。我正确设置Xmx和Xms(从eclipse中的运行配置 - >这相当于在命令提示符下运行java -XmsXXXX -XmxXXXX ......)

6 个答案:

答案 0 :(得分:2)

可以使用-Xmx(注意初始大写X)选项设置Java堆空间,如果您使用的是64位JVM,它肯定可以达到远远超过1 GB的空间。相应的物理内存可用。你应该尝试以下方面:

java -Xmx6144m ...

那就是说,你需要重新考虑你的设计。每个对象都有一个重要的空间成本,典型的最小大约每个对象12到16个字节,具体取决于您的JVM。例如,String的开销大约为36-40字节......

即使每个文档只有一个对象而且没有簿记开销(不可能!),你就没有10亿(1,000,000,000)个文档的内存。即使每个文档只有一个int,您也需要大约4 GB。

您应该重新设计应用程序以利用矩阵中的任何稀疏性,并尽可能使用基于磁盘的存储。把所有东西都记在内存中很好,但并不总是可能......

答案 1 :(得分:2)

您使用的是 32位JVM 吗?这些不能超过2 GB的堆,我从未设法分配超过1.5 GB。相反,使用 64位JVM ,因为这些可以分配更多的堆。

答案 2 :(得分:0)

或者你可以应用一些数学并使用分而治之的策略。这意味着,将问题分解为小问题以获得相同的结果。

对SVD不太了解,但也许这个页面可能会有所帮助:

http://www.netlib.org/lapack/lug/node32.html

答案 3 :(得分:0)

-Xms和-Xmx是不同的。包含s的那个是起始堆空间,而带x的那个是最大堆空间。

所以

java -Xms512 -Xmx1024

会给你512开始

正如其他人所说,虽然你可能需要打破你的问题才能让它发挥作用。你使用32位还是64位java?

答案 4 :(得分:0)

对于该大小的数据,您不应该计划将其全部存储在内存中。外部化此类数据的最常见方案是将其全部存储在数据库中,并围绕数据库查询构建程序。

答案 5 :(得分:0)

  

就目前而言,假装有十亿个条目,每个条目与3个单词相关联。

如果您有十亿个条目,则需要每个条目大小10亿倍。如果你的意思是3 x int作为12 GB的单词,至少只是数据。如果您将单词视为字符串,则可以枚举单词,因为英语中只有大约100K单词,并且它将占用相同的空间量。

考虑到16 GB的成本几百美元,我建议购买更多内存。