很抱歉,如果之前已经问过这个问题(虽然我找不到解决办法)。
我不太擅长编程,但无论如何,我正在抓取一堆网站并在服务器上存储有关它们的信息。我需要一个java程序来处理与每个文档相关联的矢量坐标(大约十亿个左右的文档,总共500,000个数字,加上或减去,与每个文档相关联)。我需要计算整个矩阵的奇异值分解。
现在,Java显然无法像我所知那样处理矩阵。如果我尝试制作一个相对较小的阵列(约4400万大),那么我将得到一个堆错误。我使用eclipse,所以我尝试将-xmx值更改为1024m(即使我有一台8gb ram的计算机,它也不会因为某些原因而变得更高)。
这有什么解决方案?检索我需要的数据的另一种方法是什么?以不同的方式计算SVD?使用不同的编程语言来做到这一点?
编辑:就目前而言,假装有十亿个条目,每个条目与3个字相关联。我正确设置Xmx和Xms(从eclipse中的运行配置 - >这相当于在命令提示符下运行java -XmsXXXX -XmxXXXX ......)答案 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不太了解,但也许这个页面可能会有所帮助:
答案 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的成本几百美元,我建议购买更多内存。