У меня есть 100 файлов, и я хочу распараллелить отправку, чтобы сэкономить время, а не запускать задания по одному. Как я могу изменить этот скрипт на массив заданий в LSF
, используя систему отправки bsub
, и запускать 10 заданий каждый раз?
#BSUB -J ExampleJob1 #Set the job name to "ExampleJob1"
#BSUB -L /bin/bash #Uses the bash login shell to initialize the job's execution environment.
#BSUB -W 2:00 #Set the wall clock limit to 2hr
#BSUB -n 1 #Request 1 core
#BSUB -R "span[ptile=1]" #Request 1 core per node.
#BSUB -R "rusage[mem=5000]" #Request 5000MB per process (CPU) for the job
#BSUB -M 5000 #Set the per process enforceable memory limit to 5000MB.
#BSUB -o Example1Out.%J #Send stdout and stderr to "Example1Out.[jobID]"
path=./home/
for each in *.bam
do
samtools coverage ${each} -o ${each}_coverage.txt
done
Спасибо за уделенное время; любая помощь приветствуется. Я новичок в LSF
и совсем запутался
Вы отметили свой вопрос тегом nextflow , поэтому я предоставлю минимальное (непроверенное) решение с использованием Nextflow, включив исполнителя LSF . Используя Nextflow, мы можем абстрагироваться от базовой системы отправки заданий и сосредоточиться на написании конвейера, каким бы тривиальным он ни был. Я думаю, что этот подход предпочтительнее, но он создает зависимость от Nextflow. Я думаю, что он небольшой и, возможно, избыточный для ваших текущих требований, но Nextflow обладает другими преимуществами, такими как возможность изменять и возобновлять когда эти требования неизбежно меняются.
Содержимое main.nf
:
params.bam_files = './path/to/bam_files/*.bam'
params.publish_dir = './results'
process samtools_coverage {
tag { bam.baseName }
publishDir "${params.publish_dir}/samtools/coverage", mode: 'copy'
cpus 1
memory 5.GB
time 2.h
input:
path bam
output:
path "${bam.baseName}_coverage.txt"
"""
samtools coverage \\
-o "${bam.baseName}_coverage.txt" \\
"${bam}"
"""
}
workflow {
bam_files = Channel.fromPath( params.bam_files )
samtools_coverage( bam_files )
}
Содержимое nextflow.config
:
process {
executor = 'lsf'
}
Запустите, используя:
nextflow run main.nf
Обратите также внимание:
LSF поддерживает ограничение памяти как для каждого ядра, так и для каждого задания. Nextflow предполагает что LSF работает в режиме ограничения памяти для каждого ядра, таким образом, он разделяет запрашиваемой памяти по количеству запрашиваемых процессоров.
Это не требуется, если LSF настроен на работу в памяти для каждого задания. лимитный режим. Вам нужно будет указать, что добавление опции
perJobMemLimit
в Scope executor в конфигурационном файле Nextflow.
Это так здорово, Стив, и ты дал замечательное объяснение. Я собираюсь попробовать это как можно скорее