由于前一个脚本中的内存限制,我在类似的问题中按照此建议对其进行了修改(不提供比工作人员更多的数据 - reading global variables using foreach in R) . 不幸的是,现在我正在努力寻找缺失的结果 .

该脚本遍历1.9M列矩阵,处理每一列并返回一行数据帧(来自foreach的rbind函数组合每一行) . 但是,在打印结果时,行数(结果)少于列数,并且每次运行时此数量都会更改 . 看起来,foreach循环中的函数没有错误,因为它在以前的脚本中运行平稳,并且不会弹出错误或警告消息 .

New Script

if(!require(R.utils)) { install.packages("R.utils"); require(R.utils)}
if(!require(foreach)) { install.packages("foreach"); require(foreach)}
if(!require(doParallel)) { install.packages("doParallel"); require(doParallel)}
if(!require(data.table)) { install.packages("data.table"); require(data.table)}
registerDoParallel(cores=6)

out.file = "data.result.167_6_inside.out"
out.file2 = "data.result.167_6_outside.out"

data1 = fread("data.txt",sep = "auto", header=FALSE, stringsAsFactors=FALSE,na.strings = "NA")
data2 = transpose(data1)
rm(data1)
data3 = data2[,3: dim(data2)[2]]
levels2 = data2[-1,1:(3-1)]
rm(data2)

colClasses=c(ID="character",Col1="character",Col2="character",Col3="character",Col4="character",Col5="character",Col6="character") 
res_table = dataFrame(colClasses,nrow=0)

write.table(res_table , file=out.file, append = T, col.names=TRUE, row.names=FALSE, quote=FALSE)
write.table(res_table, file=out.file2, append = T, col.names=TRUE, row.names=FALSE, quote=FALSE)

tableRes =  foreach(col1=data3, .combine="rbind") %dopar% {

    id1 = col1[1]
    df2function = data.frame(levels2[,1,drop=F],levels2[,2,drop=F],as.numeric(col1[-1]))
    mode(df2function[,1])="numeric"
    mode(df2function[,2])="numeric"
    values1 <- try (genericFuntion(df2function), TRUE)
        if (is.numeric(try (values1$F, TRUE))) 
        {
            res_table [1,1] = id1
            res_table [1,2] = values1$F[1,1] 
            res_table [1,3] = values1$F[1,2] 
            res_table [1,4] = values1$F[1,3] 
            res_table [1,5] = values1$F[2,2] 
            res_table [1,6] = values1$F[2,3] 
            res_table [1,7] = values1$F[3,3] 
        } else 
        { 
            res_table[1,1] = id1 
            res_table[1,2] = NA 
            res_table[1,3] = NA 
            res_table[1,4] = NA 
            res_table[1,5] = NA 
            res_table[1,6] = NA 
            res_table[1,7] = NA 
        }
write.table(fstats_table, file=out.file, append = T, col.names=FALSE, row.names=FALSE, quote=FALSE)
return(fstats_table[1,]) 
}
write.table(tableFst, file=out.file, append = T, col.names=FALSE, row.names=FALSE, quote=FALSE)

previous script 中,foreach就是这样:

tableRes =  foreach(i=1:length(data3), iter=icount(), .combine="rbind") %dopar% { (same code as above) }

因此,我想知道这种行为的可能原因是什么 .

我在群集中运行此脚本,要求80 Gb内存(在此示例中为6个内核) . 这是我可以请求单个节点的最大RAM量,以确保脚本不会因内存不足而失败 . (每个节点都有一对14核Intel Xeon skylake CPU 2.6GHz,128GB RAM; OS - RHEL 7)

Ps 1:虽然新脚本不再是分页(即使有超过8个内核),但似乎每个子进程仍然在内存中加载大量数据(~6 Gb),因为我使用top命令进行了跟踪 .

Ps 2:新脚本在foreach循环内外打印结果,以跟踪循环结束期间或之后是否发生数据丢失,因为我注意到每次运行都会在循环内外给出不同数量的打印结果 .

P3:最快的运行基于20个核心(1000次迭代为6秒),单个核心的最慢运行时间为56秒(使用具有10次重复的微基准测试进行的测试) . 但是,更多核心导致在完整矩阵(1.9M列)中返回的结果更少 .

非常感谢您提供的任何帮助,