gpt4 book ai didi

multithreading - 多线程处理70个类似的命令并从每个命令接收输出

转载 作者:行者123 更新时间:2023-12-03 13:17:00 24 4
gpt4 key购买 nike

我需要重复解析70个相同的格式的文件(不同的数据),以根据需要处理每个文件中的一些信息。 IE。 (作为简化示例)...

find /dir -name "MYDATA.bam" | while read filename; do
dir=$(echo ${filename} | awk -F"/" '{ print $(NF-1)}')
ARRAY[$dir]=$(samtools view ${filename} | head -1)
done

既然有70个文件,我希望每个 samtools view命令作为一个独立线程运行...因此,我不必等待每个命令完成(每个命令大约需要1秒钟。)之类的...
# $filename will = "/dir/DATA<id#>/MYDATA.bam"
# $dir then = "DATA<id#>" as the ARRAY key.
find /dir -name "MYDATA.bam" | while read filename; do
dir=$(echo ${filename} | awk -F"/" '{ print $(NF-1)}')
command="$(samtools view ${filename} | head -1)
ARRAY[$dir]=$command &
done
wait # To get the array loaded
(... do stuff with $ARRAY...)

但是我似乎找不到语法来获取在后台调用的所有命令,但是仍然“结果”接收(正确的)输出。

我将在一个Slurm集群上运行此命令,因此我实际上将有70个内核可用于独立运行每个命令(理论上使该步骤同时执行1-2秒,而不是连续执行70秒)。

最佳答案

您可以这样简单地使用 GNU Parallel 来做到这一点:

#!/bin/bash

doit() {
dir=$(echo "$1" | awk -F"/" '{print $(NF-1)}')
result=$(samtools view "$1" | head -1)
echo "$dir:$result"
}

# export doit() function for subshells of "parallel" to use
export -f doit

# find the files and pass, null-terminated, to GNU Parallel
find somewhere -name "MYDATA.bam" -print0 | parallel -0 doit {}

它将在每个可用的CPU内核上运行 samtools的一个副本,但是例如,如果一次只需要8个,则可以使用 parallel -j 8轻松更改它。

如果要按顺序输出,请使用 parallel -k ...
我不熟悉 集群,因此您可能必须阅读有关如何告诉 GNU Parallel 有关您的节点的知识,或者让它一次只运行8个,或者不管您的主节点有多少个内核。

关于multithreading - 多线程处理70个类似的命令并从每个命令接收输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47618734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com