разбор части скриптовой оболочки - PullRequest
1 голос
/ 02 апреля 2019
#!/bin/bash
for tracelength in 10 20 50 100 ; do
    step=0.1
    short=0
    long=1
    for firstloop in {1..10}; do
        ratio=0
        for secondloop in {1..10} ; do
            for repeat in {1..20} ; do
               echo $tracelength $short $long $ratio >results.csv
               python3 main.py "$tracelength" "$short" "$long" "$ratio" > file.smt2                     
               /usr/bin/time /Users/Desktop/optimathsat-1.5.1-macos-64-bit/bin/optimathsat < file.smt2 > results.csv
            done
            ratio=$(echo "scale=10; $ratio + $step" | bc)
        done
        short=$(echo "scale=10; $short + $step" | bc)
        long=$(echo "scale=10; $long - $step" | bc)
    done
done

Я хочу распараллелить внутренний цикл ( повтор ).

Я установил GNU параллельно и знаю некоторые основы, но поскольку цикл содержит более одной команды, я не знаю, как их распараллелить.

Я передал содержимое цикла в другой скрипт, который, я думаю, является подходящим вариантом, но мои 3 команды должны принимать переменные ( tracelength , ratio , короткие , длинные ) и бегите по ним. Любая идея, как передать параметры из сценария в индекс. или у вас может быть лучше идея распараллеливания?

Я редактирую вопрос, потому что я использовал ответ ниже, но теперь мое время выполнения всегда равно 0,00 вне зависимости от того, насколько велик file.smt2.

это новая версия кода:

 #!/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.2
    parallel doone \
             ::: 200 300 \
             :::: <(seq 0 $step 0.5) \
             ::::+ <(seq 1 -$step 0.5) \
             :::: <(seq 0 $step 0.5) \
             ::: {1..5} &> results.csv

1 Ответ

1 голос
/ 02 апреля 2019

В исходном коде вы перезаписываете results.csv снова и снова.Я предполагаю, что это ошибка, и вы вместо этого хотите, чтобы он был объединен в большой csvfile:

doone() {
    tracelength="$1"
    short="$2"
    long="$3"
    ratio="$4"
    echo "$tracelength $short $long $ratio"
    python3 main.py "$tracelength" "$short" "$long" "$ratio" |
        /usr/bin/time /Users/Desktop/optimathsat-1.5.1-macos-64-bit/bin/optimathsat
}
export -f doone
step=0.1
parallel doone \
         ::: 10 20 50 100 \
         :::: <(seq 0 $step 0.9) \
         ::::+ <(seq 1 -$step 0.1) \
         :::: <(seq 0 $step 0.9) \
         ::: {1..20} > results.csv

Если вы хотите csvfile за цикл:

parallel --results outputdir/ doone \
         ::: 10 20 50 100 \
         :::: <(seq 0 $step 0.9) \
         ::::+ <(seq 1 -$step 0.1) \
         :::: <(seq 0 $step 0.9) \
         ::: {1..20}

Если вы хотите файл csvсодержащий аргументы и время выполнения:

parallel --results output.csv doone \
         ::: 10 20 50 100 \
         :::: <(seq 0 $step 0.9) \
         ::::+ <(seq 1 -$step 0.1) \
         :::: <(seq 0 $step 0.9) \
         ::: {1..20}
...