以固定顺序并行执行
parallel execution with a fixed order
#!/bin/bash
doone() {
tracelength=""
short=""
long=""
ratio=""
echo "$tracelength $short $long $ratio" >> results.csv
python3 main.py "$tracelength" "$short" "$long" "$ratio" >> file.smt2
gtime -f "%U" /Users/Desktop/optimathsat-1.5.1-macos-64-bit/bin/optimathsat < file.smt2
}
export -f doone
step=0.1
parallel doone \
::: 200 300 \
:::: <(seq 0 $step 0.2) \
::::+ <(seq 1 -$step 0.8) \
:::: <(seq 0 $step 0.1) \
::: {1..2} &> results.csv
我需要 results.csv 中给出的数据是有序的。每个作业都会打印其输入,即开头提到的 3 个变量:$tracelength、$short、$long 和 $ratio,然后是该作业的相关执行时间;全部在一行中。到目前为止,我的结果看起来像这样:
0.00
0.00
0.00
0.00
200 0 1 0
200 0 1 0.1
200 0.1 0.9 0
如何修改订单?为什么执行时间总是 0.00? file.smt2是一个大文件,执行时间决不可能是0.00.
并行追加到同一个文件确实是个坏主意。你将到处都有竞争条件。
您正在对 results.csv
和 file.smt2
执行此操作。
因此,如果您写入 doone
中的文件,请确保它具有唯一的名称(例如,通过使用 myfile.$$
)。
要查看竞争条件是否是您的问题,您可以使 GNU Parallel 运行 一次一个作业:parallel --jobs 1
.
如果这样问题就解决了,那么您可能可以解决问题:
doone() {
tracelength=""
short=""
long=""
ratio=""
# No >> is needed here, as all output is sent to results.csv
echo "$tracelength $short $long $ratio"
tmpfile=file.smt.$$
cp file.smt2 $tmpfile
python3 main.py "$tracelength" "$short" "$long" "$ratio" >> $tmpfile
# Be aware that the output from gtime and optimathsat will be put into results.csv - making results.csv not a CSV-file
gtime -f "%U" /Users/Desktop/optimathsat-1.5.1-macos-64-bit/bin/optimathsat < $tmpfile
rm $tmpfile
}
如果 results.csv
只是一个日志文件,请考虑使用 parallel --joblog my.log
。
如果问题没有因此而消失,那么你的问题出在别处。在那种情况下制作 MCVE (https://whosebug.com/help/mcve):您的示例不完整,因为您引用了 file.smt2
和 optimathsat
而未提供它们,因此我们无法 运行 您的示例。
#!/bin/bash
doone() {
tracelength=""
short=""
long=""
ratio=""
echo "$tracelength $short $long $ratio" >> results.csv
python3 main.py "$tracelength" "$short" "$long" "$ratio" >> file.smt2
gtime -f "%U" /Users/Desktop/optimathsat-1.5.1-macos-64-bit/bin/optimathsat < file.smt2
}
export -f doone
step=0.1
parallel doone \
::: 200 300 \
:::: <(seq 0 $step 0.2) \
::::+ <(seq 1 -$step 0.8) \
:::: <(seq 0 $step 0.1) \
::: {1..2} &> results.csv
我需要 results.csv 中给出的数据是有序的。每个作业都会打印其输入,即开头提到的 3 个变量:$tracelength、$short、$long 和 $ratio,然后是该作业的相关执行时间;全部在一行中。到目前为止,我的结果看起来像这样:
0.00
0.00
0.00
0.00
200 0 1 0
200 0 1 0.1
200 0.1 0.9 0
如何修改订单?为什么执行时间总是 0.00? file.smt2是一个大文件,执行时间决不可能是0.00.
并行追加到同一个文件确实是个坏主意。你将到处都有竞争条件。
您正在对 results.csv
和 file.smt2
执行此操作。
因此,如果您写入 doone
中的文件,请确保它具有唯一的名称(例如,通过使用 myfile.$$
)。
要查看竞争条件是否是您的问题,您可以使 GNU Parallel 运行 一次一个作业:parallel --jobs 1
.
如果这样问题就解决了,那么您可能可以解决问题:
doone() {
tracelength=""
short=""
long=""
ratio=""
# No >> is needed here, as all output is sent to results.csv
echo "$tracelength $short $long $ratio"
tmpfile=file.smt.$$
cp file.smt2 $tmpfile
python3 main.py "$tracelength" "$short" "$long" "$ratio" >> $tmpfile
# Be aware that the output from gtime and optimathsat will be put into results.csv - making results.csv not a CSV-file
gtime -f "%U" /Users/Desktop/optimathsat-1.5.1-macos-64-bit/bin/optimathsat < $tmpfile
rm $tmpfile
}
如果 results.csv
只是一个日志文件,请考虑使用 parallel --joblog my.log
。
如果问题没有因此而消失,那么你的问题出在别处。在那种情况下制作 MCVE (https://whosebug.com/help/mcve):您的示例不完整,因为您引用了 file.smt2
和 optimathsat
而未提供它们,因此我们无法 运行 您的示例。