抱歉,如果之前有人问过这个问题(尽管我真的找不到解决方案)。
我不太擅长编程,但无论如何,我正在抓取一堆网站并将有关它们的信息存储在服务器上。我需要一个 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?
对于该大小的数据,不应计划将其全部存储在内存中。 外部化此类数据的最常见方案是将其全部存储在数据库中,并围绕数据库查询构建程序。
如果您有 10就目前而言,假设有十亿个条目,每个条目都有 3 个单词。
亿个条目,则需要每个条目大小的 10 亿倍。 如果您的意思是 3 x int
作为单词,则至少 12 GB 仅用于数据。如果您的意思是单词为字符串,您将枚举单词,因为英语中只有大约 100K 个单词,并且需要相同的空间量。
鉴于16 GB的成本为几百美元,我建议购买更多内存。