параллельное выполнение моей функции с помощью xargs - PullRequest
1 голос
/ 10 июля 2019

Привет всем, у меня есть следующий скрипт bash, который вызывает hmmscan из программного обеспечения hmmer3.hmmscan требует указать 6 аргументов командной строки, в этом случае код, который я написал, выглядит следующим образом:

hmmscan_fun () {
    local file=$1
    local marker_profiles=$2
    local n_threads=$3
    local out_dir=$4
    fname=$(echo $file | rev | cut -d'/' -f1 | rev)
    echo 'filename'
    echo $out_dir$fname".txt"
    echo 'n threads'
    echo $n_threads
    echo 'marker profiles'
    echo $marker_profiles
    echo $out_dir$fname".txt" >> $out_dir"out.txt"

    hmmscan -o $out_dir$fname".txt" --tblout $out_dir$fname".hmm" -E 1e-10 --cpu $n_threads $marker_profiles  $file

}

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

Мой вопрос заключается в том, что цикл довольно длинный, и я хотел бы распараллелить этот процесс для масштабирования с количеством процессоров, которые я предоставляю в командной строке.Я хочу сделать это с помощью xargs, важно, чтобы я использовал xargs, поскольку у меня нет параллельной функции GNU и, к сожалению, я не могу ничего установить.Пожалуйста помоги.По сути, я застрял в том, как вызвать функцию с помощью xargs и как передать ей множество аргументов командной строки.

1 Ответ

0 голосов
/ 11 июля 2019

Я предполагаю, что у вас есть доступ к машине для разработки, где вам разрешено устанавливать программное обеспечение.На что вы устанавливаете GNU Parallel> 20180222.

Затем запускаете:

parallel --embed > myscript.sh

Затем вы меняете последние строки myscript.sh на что-то вроде:

hmmscan_fun () {
    local file=$1
    local marker_profiles=$2
    local n_threads=$3
    local out_dir=$4
    fname=$(echo $file | rev | cut -d'/' -f1 | rev)
    echo 'filename'
    echo $out_dir$fname".txt"
    echo 'n threads'
    echo $n_threads
    echo 'marker profiles'
    echo $marker_profiles
    echo $out_dir$fname".txt" >> $out_dir"out.txt"

    hmmscan -o $out_dir$fname".txt" --tblout $out_dir$fname".hmm" -E 1e-10 --cpu $n_threads $marker_profiles  $file
}
export -f hmmscan_fun

parallel hmmscan_fun {1} {2} 32 myoutdir ::: files* ::: marker1 marker2

А затем вы перемещаете скрипт на рабочий компьютер и запускаете его там.

...