我使用doParallel进行批量任务,但即使我调用rm()和gc(),R似乎也没有释放内存。所以我的程序总是退出内存。值得一提的是我使用JRI从Java运行R,但我认为这不是Java问题而是R.这是因为(1)通过监视JVM内存消耗,它从未超过3GB(分配max = 8G) ); (2)我在公司服务器上运行一项工作,总共为工作分配了36G(JVM为8G)。由于系统错误(达到最大内存36G),作业总是退出,而不是java的outofmemory异常。对我而言,它表明Java调用的R引擎已逐渐耗尽所有可用内存。
下面是R代码和一些Java代码。 java代码非常复杂,所以我试图通过概述一般结构来简化它。
REngine re = ....
eng.parseAndEval("registerDoParallel("+cpuCores+")")
while(someCondition){
String dataMatrixFile=functionToGetDataMatrixFile("..."); /the file path
//is different in each iteration of the while loop
re.parseAndEval("m <- read.table('"+dataMatrixFile+"', header=FALSE, sep=',', skip=0)"); //read data matrix saved on the disk
re.parseAndEval("d <- dist(m, 'euclidean')"); //compute distance matrix
re.parseAndEval("clustering <- hclust(d, 'average')"); //do hierarchical
//clustering on the distance matrix
re.parseAndEval("b <- c(1, 3, 4, 7, 8, 11, ......)"); //a set of number
//of clusters to cut the dendrogram. the exact size of b and values
//depend on a java function. but lets just assume here we get a vector
//of integers, and there can be 20-100 elements.
Object result = re.parseAndEval("foreach(i=b, .combine=c, .packages='fpc') %dopar% {\n
subgraph <-cutree(clustering, k=i)
calinhara(m, subgraph)
}"); //line A. use doParallel to iterate through b, cut the
//dendrogram, and compute the calinski & harabasz statistic. The object
//returned by the foreach block is a vector of double values
re.parseAndEval("rm(list=ls())");
re.parseAndEval("gc()"); //line B
re.parseAndEval("gc()");
javaFunctionToProcess(result);
}
通过记录它似乎是&#34; A行和#34;所示的代码块。这导致内存泄漏,因为每次程序中断时我都可以在日志中看到它正在执行该块。所以我的问题是如何解决这个问题,但如果有人能解释下面的一些具体问题可能会有所帮助
1)在foreach块中,R是否创建了对象的多个副本&#34; clustering&#34;,每个核心一个并行化?
2)如果是1),这些重复对象是否自动收集垃圾?如果不是那可能是内存泄漏的原因
3)是否有必要将A行更改为:
Object result = re.parseAndEval("foreach(i=b, .combine=c, .packages='fpc') %dopar% {\n
subgraph <-cutree(clustering, k=i)
calinhara(m, subgraph)
gc()
gc()
}");
4)是否有必要并且有助于强迫&#34; R通过退出R环境释放内存,并定期重新创建R实例,例如,如下所示: re.parseAndEval(&#34; Q()&#34); re = null; re = [创建新REngine的代码]; ... //继续处理
非常感谢任何建议!