使用foreach写入R中的单个公共文件

时间:2012-09-14 18:38:25

标签: r foreach parallel-processing

我在R中有一个并行进程,它应该将每个线程的结果保存到一个公共文件中。但这样做会产生问题,因为存在数据重叠。我在数据框中聚合并且最终可以一次写入所有数据,但由于数据很大,我想确保在系统内存不足或其他情况发生时数据不会丢失。 如何写入一个文件并确保文件被锁定或数据是异步写入的。我在Windows上运行我的代码以防万一,并使用doSNOW进行并行化。

这是主要代码

HedgedPortfolio <- data.frame()
cl<-makeCluster(6) 
registerDoSNOW(cl)
no<-length(X)
HedgedPortfolio<-foreach(i=1:no,.combine='rbind') %dopar%
{
  HedgeMain(as.Date(X[i]),InitPnlRecon)
}

stopCluster(cl)
HedgeMain<-function(X,InitPnlRecon)
{    
    OptimizedPort<-.............some computation                               
    write.table(OptimizedPort,file="C:/OptimizedAll.opt",     
                quote=FALSE,append=TRUE,sep=";",
                col.names = FALSE,row.names = FALSE)
    OptimizedPort
}

2 个答案:

答案 0 :(得分:1)

我不认为R write.*cat函数为使用单个desination文件提供必要的文件锁定工具。您需要访问支持此类工具的数据库或使用多个文件。从节点终止时弹性的增加要求来看,我觉得你并不是真的想把它作为一个紧密耦合的过程运行,而是作为分布式批处理过程运行。 High Performance Computing Task View中有一个“资源管理器和批处理调度程序”部分,其中有几个软件包适用于此任务:batchBatchJobs特别是

最近有关R-Help和HPC-SIG的讨论可能是相关的。线程从这里开始:

https://stat.ethz.ch/pipermail/r-help/2012-September/324748.html

一些线程描述了一种方法,用于通过单独的CPU工作者访问磁盘文件中间的特定点。你仍然需要自己的编码来正确地确保你没有覆盖“好的数据”。

答案 1 :(得分:0)

太晚了,但是当我为我的代码寻找类似的工具时,我想出了pbdMPI包中的comm.write函数。根据文档,排名0创建了文件,并将其写入其余的排名,以便将数据附加到该文件。