【问题标题】:QSUB a process for every file in a directory?QSUB 为目录中的每个文件创建一个进程?
【发布时间】:2011-09-02 04:53:36
【问题描述】:
我一直在用
qsub -t 1-90000 do_stuff.sh
在 Sun GridEngine 集群上提交我的任务,但现在发现自己使用的数据集(也超大的)不太方便命名。解决这个问题的最佳方法是什么?我可以尝试将它们全部重命名,但名称中包含需要保留的信息,这显然会带来很多问题。我可以将所有内容预处理为 jsons,但如果有办法只使用 qsub -all_contents_of_directory,那将是理想的。
我是 SOL 吗?我应该去有问题的目录并找到 . -exec 'qsub setupscript.sh {}'?
【问题讨论】:
标签:
cluster-computing
qsub
sungridengine
【解决方案1】:
使用另一个脚本来提交作业 - 这是我使用的示例,我希望作业名称中包含目录名称。 "run_openfoam" 是特定目录中的 pbs 脚本。
#!/bin/bash
cd $1
qsub -N $1 run_openfoam
您可以调整此脚本以适合您的工作,然后通过命令行上的循环运行它。因此,您无需提交作业数组,而是为作为第一个参数传递给此脚本的每个目录名称提交作业。
【解决方案2】:
我倾向于使用 Makefile 来自动化这些东西:
INPUTFILES=$(wildcard *.in)
OUTPUTFILES=$(patsubst %.in,%.out,$(INPUTFILES))
all : $(OUTPUTFILES)
%.out : %.in
@echo "mycommand here < $< > $@" | qsub
然后输入'make',所有文件都会提交给qsub。当然,这会一次性提交所有内容,这可能会对您的计算集群和系统管理员的血压造成不利影响。
如果删除“| qsub”,make 的输出是要运行的命令列表。将该列表输入一个或多个 qsub 命令,您将提高效率并减少 qsub 作业。为此,我一直在使用 GNU 并行,但它需要一个 qsub 阻塞直到工作完成。我写了一个包装器来做到这一点,但它经常调用 qstat,这意味着对系统的大量访问。我应该以某种方式对其进行修改,但这里没有很多计算上“好的”选项。
【解决方案3】:
我无法理解您的 qsub 命令中的“-t 1-90000”。我对 qsub 手册的搜索没有显示这样的“-t”选项。
【解决方案4】:
创建一个包含数据集列表的文件
find . -print >~/list_of_datasets
脚本:
#!/bin/bash
exec ~/setupscript.sh $(sed -n -e "${SGE_TASK_ID}p" <~/list_of_datasets)
qsub -t 1-$(wc -l ~/list_of_datasets) job_script