Преобразование циклов for в сценарии, который вызывается другим сценарием, в параллельные команды GNU.

Вы перезагружаете свою систему каждый раз, когда переключаетесь между дистрибутивами Linux -, так почему бы не использовать диспетчер загрузки прошивки, чтобы делать то, что вы хотите.

1
12.07.2019, 05:50
3 ответа
parallel echo HaploSample.chr{1}{2}{3}.raw.vcf ::: 1 2 3 4 5 6 7 ::: A B D ::: _part1 _part2
1
27.01.2020, 23:22

У меня нет parallel, и я не очень понимаю, что делает ваш скрипт, поэтому я не могу проверить это. Но я верю, что это сработает, и может быть в стиле, который вы искали.

Перепишите скрипт, чтобы убрать циклы и принять аргументы :

#!/bin/bash
#parallel call SNPs with chromosomes by GATK
            (to be safe, verify that "$#" is 3)
i="$1"
o="$2"
u="$3"
            (if you want, verify that the arguments are valid)
gatk HaplotypeCaller \
          ︙       \
    -L "chr$i$o$u" \
    -O "GATK/HaplotypeCaller/HaploSample.chr$i$o$u.raw.vcf" &
 
gatk HaplotypeCaller \
          ︙       \
    -L chrUn -O GATK/HaplotypeCaller/HaploSample.chrUn.raw.vcf &
Затем запустите его следующим образом :
printf '%s\n' {1,2,3,4,5,6,7}' '{A,B,D}' '_part{1,2} | parallel -L1 (your_script)
Позвольте мне провести вас через это :
  • {1,2,3}расширяется до трех слов :1,  2 и  3.
  • {1,2,3} {A,B}расширяется до пяти слов :1,  2,  3,  A и  B.
  • {1,2,3}{A,B}расширяется до шести слов :1A,  1B,  2A,  2B,  3A и  3B.
  • {1,2,3}' '{A,B}расширяется до шести слов :1 A,  1 B,  2 A,  2 B,  3 A и  3 B. Обратите внимание, что эти «слова» содержат пробелы.
  • {1,2,3,4,5,6,7}' '{A,B,D}' '_part{1,2}расширяется до 42 (7×3×2 )слов, каждый из которых включает два пробела.
  • printf '%s\n'выводит каждое «слово» на отдельной строке. Но помните, мы говорим о «словах» с пробелами в них. В результате он печатает два или три обычных (не -пробела )слов в строке. Например,
    $ printf '%s\n' {1,2,3}' '{A,B}
    1 A
    1 B
    2 A
    2 B
    3 A
    3 B
    
    На данный момент это обычные пространства; они больше не котируются.
  • -L1указывает parallelзапустить вашу программу с данными из одной строки. Он разорвет линию на пробелы, и получить набор из трех аргументов.
1
27.01.2020, 23:22

В первом приближении распараллеливание имеет смысл, когда количество заданий <= количеству ядер. У вас есть 42 ядра? Если нет, то распараллеливание всех заданий одновременно может не иметь смысла.

Вот «наивный» способ параллельной работы:

1 )Не выполняйте команды, а ЗАПИСЫВАЙТЕ их:

for i in 1 2 3 4 5 6 7
do
  for o in A B D
  do
    for u in _part1 _part2
    do 
      echo "gatk HaplotypeCaller \
        -R /storage/ppl/wentao/GATK_R_index/genome.fa \
        -I GATK/MarkDuplicates/ApproachBsortedstettler.bam \
        -L chr$i$o$u \
        -O GATK/HaplotypeCaller/HaploSample.chr$i$o$u.raw.vcf &"
    done
  done > file-$i.sh
done

Теперь у вас есть 7 текстовых файлов по 6 команд в каждом. Вы можете выполнять параллельные задания партиями по 6, запуская эти 7 сценариев один за другим. Если у вас достаточно ядер (16? ), вы можете запускать одновременно две партии по 6 штук.

Вспенить, смыть, повторить.

0
27.01.2020, 23:22

Теги

Похожие вопросы