#!/bin/bash
doone() {
tracelength="$1"
short="$2"
long="$3"
ratio="$4"
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 。
答案 0 :(得分:0)
并行添加到同一文件确实是一个坏主意。您将在整个地方都有比赛条件。
您同时使用results.csv
和file.smt2
。
因此,如果您在doone
中写入文件,请确保该文件具有唯一的名称(例如,使用myfile.$$
)。
要查看竞赛条件是否是您遇到的问题,可以让GNU Parallel一次运行一项工作:parallel --jobs 1
。
如果问题到此为止,那么您可能可以解决:
doone() {
tracelength="$1"
short="$2"
long="$3"
ratio="$4"
# 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://stackoverflow.com/help/mcve):您的示例不完整,因为您未提供file.smt2
和optimathsat
,因此我们无法运行您的示例。