R错误:java.lang.OutOfMemoryError:java堆空间
我正在尝试将R连接到Teradata,以便将数据直接拉入R进行分析。然而,我得到的错误是R错误:java.lang.OutOfMemoryError:java堆空间,java,r,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(pa
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)。在加载rJava或任何其他软件包之前,您需要确保分配了额外的内存。首先擦除环境(通过
rm(list=ls())
),如果必须,重新启动R/Rstudio,并修改脚本开头的选项
选项(java.parameters=“-Xmx8000m”)
例如,我不知何故以一种不可复制的方式遇到了这个问题,用
-Xmx8g
部分解决了它,但随机遇到了问题
我现在通过使用找到了一个具有不同垃圾收集器的选项
options(java.parameters = c("-XX:+UseConcMarkSweepGC", "-Xmx8192m"))
library(xlsx)
在脚本开始时和加载任何其他包之前,因为其他包可以自己加载一些java内容,在加载任何java之前必须设置选项
到目前为止,问题没有再次发生
只有在长时间的会话中,有时它仍然会发生。但在这种情况下,会话重启通常可以解决问题。我添加了垃圾收集,这为我解决了问题。我正在使用RJDBC连接到Oracle数据库。
只需添加gc()即可在Mac上运行以下两行代码(在加载任何包之前):
options(java.parameters = c("-XX:+UseConcMarkSweepGC", "-Xmx8192m"))
gc()
这基本上结合了之前在这里发布的两个建议:重要的是,仅运行第一行(如drmariod所建议的)并不能解决我的问题。但是,当我在第一行之后执行gc()
时(正如用户2961057所建议的),问题就解决了
如果仍然不起作用,请重新启动R会话,然后(在加载任何包之前)改为options(java.parameters=“-Xmx8g”)
,然后直接执行gc()
。或者,尝试将RAM从“-Xmx8g”
进一步增加到例如“-Xmx16g”
(前提是您至少有同样多的RAM)
编辑:进一步的解决方案:虽然我不得不使用rJava进行R中的模型估计(从大量的X中解释y),但即使我放大到
“-Xmx60000m”
(我使用的机器有64 GB RAM),我仍不断收到上述“OutOfMemory”错误。问题是一些型号规格太大(需要更多的RAM)。在这种情况下,一种可能有帮助的解决方案是缩小问题的规模(例如,通过减少模型中的X数量),或者——如果可能的话——将问题分成独立的部分,分别进行评估,然后再将这些部分放在一起。您是否可以尝试使用更少的内存来验证它是否有效?仅仅因为原始数据只有3GB,并不排除JVM需要更多内存的可能性。在启动java实例之前,必须确保运行options(java.parameters=“-Xmx8g”)
。因此,在没有加载包的情况下,在新的R会话中启动。运行该命令,然后加载所有包并重试。您应该很好,但JVM可能因为其他原因需要很多。我猜“计算的数据大小”是存储的有意义信息的大小。然而,数据结构在内存消耗方面并不理想-它们有用于内部使用的字段,它们分配额外的内存以防止重复分配数据添加,因此即使没有任何数据的空数据结构也会消耗一些内存。因此,3Gb的数据很容易需要超过8Gb的操作内存。是的。不知何故,这也使我的代码比以前运行得更快。这确实是正确的答案。非常感谢。