python - 在集群上运行通过 qsub 从 Python 提交的作业。是否有意义?

标签 python cluster-computing qsub

我有这样的情况,我正在用 Python 进行一些计算,并且根据结果我有一个目标文件列表,这些文件是要传递给第二个程序的候选对象。

例如,我有 50,000 个文件,每个文件包含大约 2000 个项目。我想过滤某些项目并调用命令行程序对其中一些进行一些计算。

程序 #2 可以通过 shell 命令行使用,但也需要一组冗长的参数。由于性能原因,我必须在集群上运行程序 #2。

现在,我正在通过以下方式运行程序 #2 'subprocess.call("...", shell=True) 但我想在未来通过 qsub 运行它。 对于如何以合理有效的方式完成这件事,我没有太多经验。

编写临时“qsub”文件并直接从 Python 脚本通过 subprocess() 运行它们是否有意义?有没有更好的,也许更像 pythonic 的解决方案?

非常欢迎任何想法和建议!

最佳答案

这很有意义,尽管我会选择另一种解决方案。

据我了解,您有程序 #1 来确定您的 50,000 个文件中的哪些文件需要由程序 #2 计算。 程序 #1 和 #2 都是用 Python 编写的。绝佳的选择。

顺便说一下,我有一个 Python 模块可能会派上用场:https://gist.github.com/stefanedwards/8841307

如果您正在运行与我相同的 qsub 系统(不知道我们的叫什么),您不能在提交的脚本上使用命令参数。相反,任何选项都通过 -v 选项提交,将它们放入环境变量中,例如:

[me@local ~] $ python isprime.py 1
1: True 
[me@local ~] $ head -n 5 isprime.py
#!/usr/bin/python
### This is a python script ...
import os
os.chdir(os.environ.get('PBS_O_WORKDIR','.'))

[me@local ~] $ qsub -v isprime='1 2 3' isprime.py
123456.cluster.control.com
[me@local ~]

在这里,isprime.py 可以使用 argparse 处理命令行参数。然后你只需要检查脚本是否作为提交的作业运行,然后从环境变量 (os.environ) 中检索所述参数。

当程序 #2 被修改为在集群上运行时,程序 #1 可以使用 subprocess.call(['qsub','-v options=...','programme2.py '], shell=FALSE)

另一种方法是将数据库(例如,SQLite 数据库)中的所有文件排队。然后你可以让程序 #1 检查数据库中所有未处理的条目,确定结果(运行、不运行、使用特殊选项运行)。 您现在有机会在集群上并行运行程序 #2,它只是检查数据库中是否有要分析的文件。

编辑:当程序 #2 是可执行文件时

我们使用 bash 脚本代替 python 脚本,该脚本获取环境变量并将它们放在程序的命令行上:

#!/bin/bash
cd .
# put options into context/flags etc.
if [ -n $option1 ]; then _opt1="--opt1 $option1"; fi
# we can even define our own defaults
_opt2='--no-verbose'
if [ -n $opt2 ]; then _opt2="-o $opt2"; fi
/path/to/exe $_opt1 $opt2

如果你正在寻找数据库解决方案,那么有一个 python 脚本来检查数据库中是否有未处理的文件,将文件标记为正在处理(在单个事务中执行这些操作),获取选项,使用 subprocess 调用可执行文件,完成后,将文件标记为完成,检查新文件等。

关于python - 在集群上运行通过 qsub 从 Python 提交的作业。是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21595488/

相关文章:

storage - 无法部署 Ceph 监视器

linux - qsub 数组作业延迟

python - 为新语言构建词性标注器

python - 如何收集结构任务输出并打印多个主机的摘要?

r - 无法在 linux 上安装 R "fpc"包

node.js - 使用 mesos 在 Node.js 中进行集群

Python:PBS 提交,如果我更改脚本会怎样?

Snakemake如何为每个任务设置qsub ppn?

python - 如何使用python检查目录中所有图像的尺寸?

Python:比较几千个字符串。有没有比较快的选择?