2015-02-24 68 views
2

我目前已經編寫了一個R腳本來執行羣體遺傳模擬,然後用我的結果寫入一個表格到一個文本文件。我想以某種方式並行使用數組作業(我的大學的集羣使用SGE)運行此腳本的多個實例,並且當完成時我將生成與每個作業對應的結果文件(Results_1.txt,Results_2.txt等) )。SGE陣列作業和R

花了更多的時間閱讀下午,試圖找出如何做到這一點,但還沒有真正找到我想要做的事情。我想知道是否有人可以提供和示例,或者可能指向我可以閱讀的東西的方向來幫助解決這個問題。

回答

2

要mithrado的答案歸結爲最基本的要素:

創建作業腳本,pop_gen.bash,可能會或可能不會採取SGE任務id參數的輸入,存儲在由同一SGE任務ID標識的特定文件的結果:

#!/bin/bash 
Rscript pop_gen.R ${SGE_TASK_ID} > Results_${SGE_TASK_ID}.txt 

將此腳本提交爲作業數組,例如1000作業:

qsub -t 1-1000 pop_gen.bash 

網格引擎將執行pop_gen.bash 1000次,每次將SGE_TASK_ID設置爲範圍從1-1000的值。

另外,如上所述,通過傳遞SGE_TASK_ID作爲命令行變量pop_gen.R你可以使用SGE_TASK_ID寫入到輸出文件:

args <- commandArgs(trailingOnly = TRUE) 
out.file <- paste("Results_", args[1], ".txt", sep="") 
# d <- "some data frame" 
write.table(d, file=out.file) 

HTH

+0

我給這是一個嘗試,似乎它一直到需要寫出表格的時間。我使用qsub -t 1-3 myscript.bash做了一個測試。生成了四個文件,Results_1.txt,Results_2.txt,Results_3.txt和Results_NA.txt。前三個文件剛剛有一些東西從我的模擬打印到終端,而Results_NA.txt似乎有正確的信息運行(我認爲他們都創建了一個Results_NA.txt文件,並且有一些重寫)。你能否解釋一些關於將SGE_TASK_ID傳遞給R的問題?這似乎是問題所在。 – user3381331 2015-02-24 21:34:09

+0

你是否將輸出重定向到命令行以及R中的相同文件?我問,因爲你說Results_1.txt文件有stdout/stderr的文本。如果是這樣,請勿在作業腳本中重定向到文件,即移除'>結果_ $ {SGE_TASK_ID} .txt'。現在,對於Results_NA.txt問題,我懷疑參數沒有正確讀入R中。在我的代碼中,由於我寫了'SGE_TASKID'而不是'SGE_TASK_ID',所以出現錯誤。也許這是問題? – Vince 2015-02-24 21:52:54

+0

好的,這清除了它。修正了拼寫錯誤,併爲表格使用了不同的名稱,所以我可以擁有終端輸出以及我的表格。非常感謝您的幫助! – user3381331 2015-02-24 22:04:11

1

我不習慣在R中這樣做,但我一直在Python中使用相同的方法。想象一下你有一個腳本genetic_simulation.r,它有3個參數: --gene_id --khmer_len和--output_file。

你將有一個csv文件,用n行genetic_sim_parms.csv:

first_gene,10,/result/first_gene.txt 
... 
nth_gene,6,/result/nth_gene.txt 

一個進口細節是你genetic_simulation.r的第一線。它需要知道集羣要使用哪個可執行文件。您可能需要調整其參數爲好,根據您的設置,它看起來就像到:

#!/path/to/Rscript --vanilla 

最後,你需要一個陣列工作的bash腳本:

#!/bin/bash 
#$ -t 1:N < change to number of rows in genetic_sim_parms.csv 
#$ -N genetic_simulation.r 

echo "Starting on : $(date)" 
echo "Running on node : $(hostname)" 
echo "Current directory : $(pwd)" 
echo "Current job ID : $JOB_ID" 
echo "Current job name : $JOB_NAME" 
echo "Task index number : $SGE_TASK_ID" 
ID=$(awk -F, -v "line=$SGE_TASK_ID" 'NR==line {print $1}' genetic_sim_parms.csv) 
LEN=$(awk -F, -v "line=$SGE_TASK_ID" 'NR==line {print $2}' genetic_sim_parms.csv) 
OUTPUT=$(awk -F, -v "line=$SGE_TASK_ID" 'NR==line {print $3}' genetic_sim_parms.csv) 

echo "id is: $ID" 
rscript genetic_simulation.r --gene_id $ID --khmer_len $LEN --output_file $OUTPUT 
echo "Finished on : $(date)" 

希望這幫助!