3

我在 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
}
4

2 回答 2

1

我不认为 Rwrite.*cat函数为使用单个目标文件提供了必要的文件锁定设施。您要么需要访问支持此类设施的数据库,要么需要使用多个文件。从节点终止时增加的弹性要求来看,在我看来,您并不想将其作为紧密耦合的进程运行,而是作为分布式批处理进程运行。高性能计算任务视图中有一个“资源管理器和批处理调度程序”部分,其中一些包听起来适用于此任务:特别是批处理BatchJobs

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

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

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

于 2012-09-15T15:52:24.370 回答
0

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

于 2018-01-05T22:40:30.373 回答