2

抱歉,之前是否有人问过这个问题(尽管我真的找不到解决方案)。

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

现在,据我所知,Java 显然无法处理这么大的矩阵。如果我尝试制作一个相对较小的数组(大约 4400 万大),那么我会得到一个堆错误。我使用 eclipse,因此我尝试将 -xmx 值更改为 1024m(即使我有一台具有 8gb 内存的计算机,由于某种原因它也不会更高)。

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

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

4

6 回答 6

2

Java 堆空间可以使用-Xmx(注意首字母大写X)选项进行设置,如果您使用的是 64 位 JVM 并且相应的物理内存可用,那么它肯定可以达到 1 GB 以上。您应该尝试以下方式:

java -Xmx6144m ...

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

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

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

于 2012-08-06T17:44:36.563 回答
2

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

于 2012-08-06T17:47:33.270 回答
0

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

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

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

于 2012-08-06T17:47:22.463 回答
0

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

所以

java -Xms512 -Xmx1024

会给你512开始

正如其他人所说,尽管您可能需要分解问题才能使其正常工作。您使用的是 32 位还是 64 位 Java?

于 2012-08-06T17:48:13.807 回答
0

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

于 2012-08-06T17:49:36.657 回答
0

就目前而言,假设有 10 亿个条目,每个条目关联 3 个单词。

如果您有 10 亿个条目,则需要每个条目大小的 10 亿倍。如果您的意思是 3 xint作为单词,那么至少仅用于数据就需要 12 GB。如果您将单词表示为字符串,您将枚举单词,因为英语中只有大约 100K 单词,并且占用相同的空间。

鉴于 16 GB 需要几百美元,我建议购买更多内存。

于 2012-08-06T18:13:03.300 回答