7

我正在以相当大的算法评估来自文本文件的不同数据。

如果文本文件包含多个数据点(我需要的最小值是 130 万个数据点),则会出现以下错误:

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
   at java.util.regex.Matcher.<init>(Unknown Source)
   at java.util.regex.Pattern.matcher(Unknown Source)
   at java.lang.String.replaceAll(Unknown Source)
   at java.util.Scanner.processFloatToken(Unknown Source)
   at java.util.Scanner.nextDouble(Unknown Source)

当我在 Eclipse 中使用已安装的 jre6(标准 VM)的以下设置运行它时:

-Xms20m -Xmx1024m -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:NewSize=10m 
-XX:MaxNewSize=10m -XX:SurvivorRatio=6 -XX:TargetSurvivorRatio=80 
-XX:+CMSClassUnloadingEnabled

请注意,如果我只运行部分文本文件,它就可以正常工作。

现在我已经阅读了很多关于这个主题的内容,似乎在某个地方我必须有数据泄漏或者我在数组中存储了太多数据(我想我这样做了)。

现在我的问题是:我该如何解决这个问题?是否可以更改我的设置以便我仍然可以执行计算,还是我真的需要更多的计算能力?

4

3 回答 3

3

真正关键的 vm arg 是-Xmx1024m,它告诉 VM 最多使用 1024 兆字节的内存。最简单的解决方案是在那里使用更大的数字。假设您的机器中有足够的 RAM 来处理它,您可以尝试-Xmx2048mor或任何数字。-Xmx4096m

我不确定您是否从任何其他 VM 参数中获得了很多好处。在大多数情况下,如果你告诉 Java 要使用多少空间,它会很聪明地处理其余的参数。我建议删除除-Xmx参数之外的所有内容并查看其执行情况。

更好的解决方案是尝试改进您的算法,但我尚未详细阅读它以提供任何建议。

于 2013-05-31T20:17:54.600 回答
3

正如您所说,数据量确实非常大,如果即使在使用 jvm 参数后它仍无法放入一台计算机的内存中-Xmx,那么您可能希望转移到集群计算,使用多台计算机来解决您的问题。为此,您必须使用消息传递接口 ( MPI)。

MPJ ExpressMPIJava 的一个非常好的实现,或者在 C/C++ 等语言中,对于MPI现有的 likeOpen MPImpich2. 我不确定它在这种情况下是否会帮助你,但肯定会在未来的项目中帮助你。

于 2014-03-16T13:41:49.630 回答
1

我建议你

  • 使用分析器来最小化您的内存使用量。我怀疑您可以通过使用原语、二进制数据和更紧凑的集合将其减少 10 倍或更多。
  • 增加您机器中的内存。上次我对数百个信号进行回测时,我有 256 GB 的主内存,这有时还不够。您可以获得的内存越多越好。
  • 使用内存映射文件来提高内存效率。
  • 将数据集的大小减少到机器和程序可以支持的时间。
于 2013-05-31T20:27:35.763 回答