13

我正在使用 xlsx 包创建工作簿、工作表,将数据写入工作表,然后保存工作簿。但是,当我多次重复这组操作时,我开始出现错误消息:

>Error in .jcheck(silent = FALSE) : 
  java.lang.OutOfMemoryError: GC overhead limit exceeded.jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, .jcast(if (inherits(o, "jobjRef") || inherits(o, "jarrayRef")) o else cl, "java/lang/Object"), .jnew("java/lang/String", method), j_p, j_pc, use.true.class = TRUE, evalString = simplify, evalArray = FALSE)<S4 object of class "jobjRef"

>Error in .jnew("java/io/FileOutputStream", file) : 
  Java Exception <no description because toString() failed>.jnew("java/io/FileOutputStream", file)<S4 object of class "jobjRef">

>Error in .jnew("org/apache/poi/xssf/usermodel/XSSFWorkbook") : 
  Java Exception <no description because toString() failed>.jnew("org/apache/poi/xssf/usermodel/XSSFWorkbook")<S4 object of class "jobjRef">

Error in .jcheck(silent = FALSE) : 
  Java Exception <no description because toString() failed>.jcall(wb, "Lorg/apache/poi/ss/usermodel/Sheet;", "createSheet", sheetName)<S4 object of class "jobjRef"

我猜这是因为重复操作会消耗 Java 内存。

我的问题是,我怎样才能清除/重新初始化内存,以便我可以再次重复这些操作而不会出现内存不足错误?

r中是否有任何简单的代码可以实现这一点?

非常感谢您的建议!

4

2 回答 2

9

我不知道如何在 xlsx 上进行操作,实际上由于这些问题我不再使用它

我现在使用 XLConnect,它有一个命令

xlcFreeMemory()

这样做

请注意,为了获得最佳效果,您需要在加载之前增加 Java 内存,如下所示

options( java.parameters = "-Xmx4g" )
library(XLConnect)

祝你好运

于 2014-02-05T18:50:05.290 回答
4

捎带上面的答案,注意你不需要XLConnect完成xlcFreeMemory... 的效果,只需注意xlcFreeMemory实际做的是运行以下内容:

gc()
J("java.lang.Runtime")$getRuntime()$gc()

也就是说,它gc()首先在您的 R 环境中运行,然后在现有 Java 实例的环境中运行。

于 2018-10-09T05:32:45.920 回答