我目前有一个用于执行群体遗传模拟的R脚本,然后将包含我的结果的表格写入文本文件。我想以某种方式使用数组作业并行地运行此脚本的多个实例(我的大学的集群使用SGE),当它全部完成后,我将生成与每个作业相对应的结果文件(Results_1.txt,Results_2.txt等)。
在下午阅读时花了很多时间并试图弄清楚如何做到这一点,但是我没有真正发现任何与我想做的事情有关的事情。我想知道是否有人可以提供和示例,或者可能指出我可以阅读的方向来帮助解决这个问题。
答案 0 :(得分:3)
简化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
Grid Engine将执行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
答案 1 :(得分: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
导入细节是遗传模拟的第一道。它需要告诉群集将使用哪个可执行文件。您可能还需要调整其参数,具体取决于您的设置,它将如下所示:
#!/path/to/Rscript --vanilla
最后,您需要一个array-job 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)"
希望这有帮助!