SGE 数组作业和 R
SGE array jobs and R
我目前编写了一个 R 脚本来执行种群遗传模拟,然后将 table 和我的结果写入文本文件。我想以某种方式 运行 这个脚本的多个实例并行使用数组作业(我大学的集群使用 SGE),当它全部完成时,我将生成对应于每个作业的结果文件(Results_1.txt , Results_2.txt, 等等).
花了下午的大部分时间阅读并试图弄清楚如何做到这一点,但并没有真正找到与我正在尝试做的事情相符的任何东西。我想知道是否有人可以提供和示例,或者指出我可以阅读的方向以帮助解决这个问题。
我不习惯在 R 中这样做,但我一直在 python 中使用相同的方法。假设您有一个脚本 genetic_simulation.r 并且它有 3 个参数:
--gene_id --khmer_len 和 --output_file.
您将有一个 csv 文件,genetic_sim_parms.csv 有 n 行:
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 }' genetic_sim_parms.csv)
LEN=$(awk -F, -v "line=$SGE_TASK_ID" 'NR==line {print }' genetic_sim_parms.csv)
OUTPUT=$(awk -F, -v "line=$SGE_TASK_ID" 'NR==line {print }' 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)"
希望对您有所帮助!
归纳 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
我目前编写了一个 R 脚本来执行种群遗传模拟,然后将 table 和我的结果写入文本文件。我想以某种方式 运行 这个脚本的多个实例并行使用数组作业(我大学的集群使用 SGE),当它全部完成时,我将生成对应于每个作业的结果文件(Results_1.txt , Results_2.txt, 等等).
花了下午的大部分时间阅读并试图弄清楚如何做到这一点,但并没有真正找到与我正在尝试做的事情相符的任何东西。我想知道是否有人可以提供和示例,或者指出我可以阅读的方向以帮助解决这个问题。
我不习惯在 R 中这样做,但我一直在 python 中使用相同的方法。假设您有一个脚本 genetic_simulation.r 并且它有 3 个参数: --gene_id --khmer_len 和 --output_file.
您将有一个 csv 文件,genetic_sim_parms.csv 有 n 行:
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 }' genetic_sim_parms.csv)
LEN=$(awk -F, -v "line=$SGE_TASK_ID" 'NR==line {print }' genetic_sim_parms.csv)
OUTPUT=$(awk -F, -v "line=$SGE_TASK_ID" 'NR==line {print }' 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)"
希望对您有所帮助!
归纳 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