параллельное исполнение с фиксированным порядком - PullRequest
1 голос
/ 04 апреля 2019
#!/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, чтобы они были в порядке.Каждое задание печатает свои входные данные, которые являются тремя переменными, упомянутыми в начале: $ 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 .

1 Ответ

0 голосов
/ 05 апреля 2019

Это действительно плохая идея, чтобы добавить к одному и тому же файлу параллельно. У вас будут гоночные условия повсюду.

Вы делаете это с 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, не предоставляя их, поэтому мы не можем запустить ваш пример.

...