R控制doParallel中的内存使用情况

时间:2015-08-03 08:08:57

标签: r rjava jri

我使用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的代码];     ... //继续处理

非常感谢任何建议!

0 个答案:

没有答案