2012-09-14 37 views
2

我在R中有一個並行進程,應該將每個線程的結果保存到一個公用文件中。但是這樣做會產生問題,因爲有數據重疊。我在數據框中進行聚合,並且可以一次寫入所有數據,但由於數據量很大,我想確保數據在系統內存不足或發生其他事情時不會丟失。 如何寫入一個文件並確保文件被鎖定或數據是異步寫入的。我正在Windows上運行我的代碼以防萬一,並且我正在使用doSNOW進行並行化。使用foreach寫入R中的單個公用文件

這裏是主代碼

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 
} 
+0

相似問題:http://stackoverflow.com/q/12303088/602276 – Andrie

回答

1

我不認爲是R write.*cat功能提供必要的文件鎖定設施使用單一desination文件。您需要訪問支持這些設施的數據庫或使用多個文件。從節點終止時彈性的附加要求來看,我覺得你並不是真的想把它作爲一個緊密耦合的過程來運行,而是作爲分佈式批處理過程來運行。有在High Performance Computing Task View其中幾個包的聲音適用於這個任務「資源管理器和批處理調度」部分是:batchBatchJobs特別

已經有上R-幫助和HPC-SIG最近的討論可能相關。線程從這裏開始:

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

一些線程描述的特定點的加入方法由單獨的CPU-工人磁盤文件的中間。你仍然需要你自己的編碼來正確確保你沒有覆蓋「好數據」。

0

太晚了,但我正在尋找一個類似的設施,我的代碼想出了來自pbdMPI包的comm.write函數。基於文檔,rank 0創建了文件,然後寫入該文件,然後寫入該文件的其餘部分,以便將數據附加到該文件。