R错误:java.lang.OutOfMemoryError:Java堆空间

时间:2016-01-06 01:02:48

标签: java r

我正在尝试将R连接到Teradata以将数据直接拉入R进行分析。但是,我收到错误,

Error in .jcall(rp, "I", "fetch", stride, block) :
  java.lang.OutOfMemoryError: Java heap space

我尝试设置我的R选项以通过执行以下操作来增加JVM的最大堆大小:

options(java.parameters = "-Xmx8g")

我还尝试使用rJava函数.jinit初始化java参数:.jinit(parameters="-Xmx8g")。 但仍然失败了。

计算出的数据大小应约为3G(实际上小于3G)。

4 个答案:

答案 0 :(得分:22)

您需要确保在加载rJava或任何其他软件包之前分配额外的内存。首先擦除环境(通过rm(list = ls())),如果必须,重新启动R / Rstudio,并修改脚本开头的选项。

options(java.parameters = "-Xmx8000m")

参见例如https://support.snowflake.net/s/article/solution-using-r-the-following-error-is-returned-javalangoutofmemoryerror-gc-overhead-limit-exceeded

答案 1 :(得分:1)

我以某种无法再现的方式遇到了这个问题,用-Xmx8g部分地解决了这个问题,但是随机遇到了问题。

我现在通过使用

找到了一个具有其他垃圾收集器的选项
options(java.parameters = c("-XX:+UseConcMarkSweepGC", "-Xmx8192m"))
library(xlsx)
脚本开头的

。到目前为止,该问题不再发生。

编辑:
我弄清楚了,我们甚至可以组合多个java参数。因此,该解决方案到目前为止并未失败。

编辑2: 因此,关于这一解决方案,还有一件事情,我今天想通了,在加载任何其他软件包之前执行options命令是很省钱的!!!由于某些软件包本身会加载一些Java东西,因此必须在R会话的开始时设置选项!

答案 2 :(得分:1)

在 Mac 上运行以下两行代码(在加载任何包之前)对我有用:

options(java.parameters = c("-XX:+UseConcMarkSweepGC", "-Xmx8192m"))
gc()

这基本上结合了之前在此处发布的两个建议:重要的是,仅运行第一行(如 drmariod 所建议的)并不能解决我的问题。但是,当我在第一行之后(如 user2961057 建议的那样)另外执行 gc() 时,问题就解决了。

如果它仍然不起作用,请重新启动 R 会话,然后尝试(在加载任何包之前)改为 options(java.parameters = "-Xmx8g"),然后直接执行 gc()。或者,尝试将 RAM 从 "-Xmx8g" 进一步增加到例如"-Xmx16g"(前提是您至少有同样多的 RAM)。

编辑:进一步的解决方案:虽然我不得不在 R 中使用 rJava 进行模型估计(从大量 X 中解释了 y),但我一直收到上述信息'OutOfMemory' 错误,即使我扩展到 "-Xmx60000m"(我使用的机器有 64 GB RAM)。问题是某些型号规格太大了(并且需要更多的 RAM)。在这种情况下可能有帮助的一种解决方案是缩小问题的规模(例如,通过减少模型中 X 的数量),或者——如果可能的话——将问题分成独立的部分,分别估计每个部分,然后将这些部分放在一起再次。

答案 3 :(得分:-1)

我添加了垃圾回收,这为我解决了这个问题。我正在使用RJDBC连接到Oracle数据库。
只需添加gc()