在使用类似picard
或fgbio
通过snakemake 包装器之类的工具时,我一直遇到内存不足的问题。目前我求助于直接shell
调用,这允许我设置虚拟机内存。我更愿意将这些参数传递给包装的工具。有没有办法,也许通过resources
指令,传递类似的东西mem_mb=10000
?我试过了,但还没有让它工作。
问问题
297 次
2 回答
1
from snakemake.shell import shell
shell("picard MarkDuplicates {snakemake.params} INPUT={snakemake.input} "
"OUTPUT={snakemake.output.bam} METRICS_FILE={snakemake.output.metrics} "
"&> {snakemake.log}")
params: "smth"
因此,您可以使用section传递任何选项。
如果您检查picard
可执行的脚本源:
cat `which picard`
你会找到:
...
pass_args=""
for arg in "$@"; do
case $arg in
'-D'*)
jvm_prop_opts="$jvm_prop_opts $arg"
;;
'-XX'*)
jvm_prop_opts="$jvm_prop_opts $arg"
;;
'-Xm'*)
jvm_mem_opts="$jvm_mem_opts $arg"
;;
*)
if [[ ${pass_args} == '' ]] #needed to avoid preceeding space on first arg e.g. ' MarkDuplicates'
then
pass_args="$arg"
else
pass_args="$pass_args \"$arg\"" #quotes later arguments to avoid problem with ()s in MarkDuplicates regex arg
fi
;;
esac
done
...
所以我认为这应该有效:
rule markdups:
input:
"in.bam",
output:
bam = "out.bam",
metrics = "metrics.tmp",
params:
"-Xmx10000m"
wrapper:
"0.31.0/bio/picard/markduplicates"
于 2019-01-18T12:55:04.897 回答
1
我从未使用过 wrapper 指令,但例如在markduplicates/wrapper.py中查找 shell 命令是picard MarkDuplicates {snakemake.params} ...
. 所以也许使用params
插槽有效?
rule markdups:
input:
'in.bam',
output:
bam= 'out.bam',
metrics= 'metrics.tmp',
params:
mem= "-Xmx4g",
wrapper:
"0.31.0/bio/picard/markduplicates"
picard 应该明白这-Xmx...
是一个 java 参数。
于 2019-01-17T15:51:46.477 回答