【问题标题】:runing my function in parallel using xargs使用 xargs 并行运行我的函数
【发布时间】:2019-11-20 08:41:35
【问题描述】:

大家好,我有以下从 hmmer3 软件调用 hmmscan 的 bash 脚本。 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,并且我使用此文件名附加到输出名称上,以便我将有不同的输出名称对应于我的每个输入文件。

我的问题是循环很长,我想将此过程并行化,以根据我在命令行提供的 CPU 数量进行扩展。我想使用 xargs 这样做很重要,我使用 xargs 因为我没有 GNUs 并行功能,不幸的是我无法安装任何东西。请帮忙。基本上我坚持如何使用 xargs 调用函数以及如何将许多命令行参数传递给它。

【问题讨论】:

  • 如果您无法安装任何东西,您将如何使用您得到的任何答案?您是否要将获得的答案复制并粘贴到脚本中?如果是这样,那正是 GNU Parallel 的本质——它是一个可以复制和粘贴的 Perl 脚本。
  • 请查看parallel --embed(自 20180222 起可用)。它适用于不允许您安装软件,但允许您运行自己的脚本的情况。

标签: bash parallel-processing gnu-parallel


【解决方案1】:

我假设您可以访问允许您安装软件的开发机器。在上面安装 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

然后您将脚本移动到生产机器并在那里运行。

【讨论】:

    猜你喜欢
    • 2015-04-06
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2011-10-20
    相关资源
    最近更新 更多