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



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

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

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

对此有什么解决方案?检索我需要的数据的另一种方法?以不同的方式计算 SVD?使用不同的编程语言来执行此操作?

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

可以使用

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

java -Xmx6144m ...

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

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

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

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

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

对 SVD 了解不多,但也许此页面会有所帮助:

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

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

所以

java -Xms512 -Xmx1024

会给你 512 开始

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

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

就目前而言,假设有十亿个条目,每个条目都有 3 个单词。

如果您有 10

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

鉴于16 GB的成本为几百美元,我建议购买更多内存。

相关内容

  • 没有找到相关文章

最新更新