2

在使用类似picardfgbio通过snakemake 包装器之类的工具时,我一直遇到内存不足的问题。目前我求助于直接shell调用,这允许我设置虚拟机内存。我更愿意将这些参数传递给包装的工具。有没有办法,也许通过resources指令,传递类似的东西mem_mb=10000?我试过了,但还没有让它工作。

4

2 回答 2

1

根据包装器来源(https://bitbucket.org/snakemake/snakemake-wrappers/src/bd3178f4b82b1856370bb48c8bdbb1932ace6a19/bio/picard/markduplicates/wrapper.py?at=master&fileviewer=file-view-default),它使用命令行:

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 回答