实用场景
1你的任务是相互独立的
2你本来使用的是for循环,你想提高时间想要把全部这些独立的文件,一起提交一起跑
3你的任务数量很多并且任务同时用一个脚本,只是不同任务的参数不一样呀,本质上你一个个提交也可以,但是显的很呆。
需要的文件
1. config.txt (参数文件)
1 40 1 1457
2 40 1457 2913
3 40 2913 4369
4 40 4369 5825
5 40 5825 7281
6 40 7281 8737
7 40 8737 10193
8 40 10193 11649
参数文件就是传入你python文件的参数。上面的第一个数字是任务的编号,分别是任务1,2,3。每个任务编号传入3个参数,例如1号任务传入参数是40,1,1457
这个代码可以快速的建立一个config文件
# 初始化空列表,用于存储数据
data = []
# 第一列是行号(从1开始)
for row in range(1, 11): # 假设需要生成10行数据,你可以调整行数
# 第二列是0到7的数字
for second_column in range(0, 8):
# 第三列是第二列基础上遍历16到31的数字
for third_column in range(16, 32):
data.append([row, second_column, third_column])
# 将结果写入到 output.txt 文件中
with open('output.txt', 'w') as file:
for row in data:
# 将每行数据以空格分隔并写入文件
file.write(f"{row[0]} {row[1]} {row[2]}\n")
print("数据已成功写入 output.txt 文件!")
2. test.py (这些任务的共同脚本)
a = [sys.argv[1],sys.argv[2],sys.argv[3]]
在你的脚本里面加入这行代码就可以从python脚本的外部导入参数了。
3. bash.sh (bash脚本)
#!/bin/bash
#SBATCH --job-name=p1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=1
##指定每个任务占用几个核
#SBATCH --array=1-5
## 设定你的全部的任务数
#SBATCH --output=out/array_%A-%a.out
##可以把out文件都统一放好
#SBATCH --nodelist=c003
##指定服务器的节点c003,或者你也可以不指定,这样的话,你就可以同时使用多个核去运行任务
config=config.txt
scan=$(awk -v ArrayTaskID=$SLURM_ARRAY_TASK_ID '$1==ArrayTaskID {print $2}' $config)
chan1=$(awk -v ArrayTaskID=$SLURM_ARRAY_TASK_ID '$1==ArrayTaskID {print $3}' $config)
chan2=$(awk -v ArrayTaskID=$SLURM_ARRAY_TASK_ID '$1==ArrayTaskID {print $4}' $config)
#分别读取config.txt文件中每一行的第2,3,4的参数
srun each_scan_pocal.py ${scan} ${chan1} ${chan2}
#运行你的python程序