我有一个 Linux 工具,可以(大大简化)剪切 illumnaSeq 文件中指定的序列。我有 32 个锉刀要磨。处理一份文件大约需要 5 小时。我有一台centos服务器,它有128个核心。
我找到了一些解决方案,但每种解决方案的工作方式都仅使用一个核心。最后一个似乎会发射 32 个 nohups,但它仍然会用一个核心对整个系统施加压力。
我的问题是,有人知道如何利用服务器的潜力吗?因为基本上每个文件都可以独立处理,所以它们之间没有关系。
这是脚本的当前版本,我不知道为什么它只使用一个核心。我在堆栈上的建议的帮助下编写了它并在互联网上找到了:
#!/bin/bash
FILES=/home/daw/raw/*
count=0
for f in $FILES
to
base=${f##*/}
echo "process $f file..."
nohup /home/daw/scythe/scythe -a /home/daw/scythe/illumina_adapters.fa -o "OUT$base" $f &
(( count ++ ))
if (( count = 31 )); then
wait
count=0
fi
done
我正在解释:FILES 是原始文件夹中的文件列表。
执行nohup的“核心”行:第一个路径是工具的路径,-a路径是要剪切的文件的路径,out保存与处理后的文件名相同的+开头的OUT。最后一个参数是要处理的输入文件。
这里自述工具:https://github.com/vsbuffalo/scythe https://github.com/vsbuffalo/scythe
有人知道你该如何处理吗?
附:我也尝试在计数之前移动nohup,但它仍然使用一个核心。我对服务器没有限制。
恕我直言,最有可能的解决方案是GNU 并行,所以你可以并行运行 64 个作业,如下所示:
parallel -j 64 /home/daw/scythe/scythe -a /home/daw/scythe/illumina_adapters.fa -o OUT{.} {} ::: /home/daw/raw/*
这样做的好处是作业不会进行批处理,它会始终保持 64 个作业在运行,并在每个作业完成时启动一个新作业,这比在开始最后一个作业之前等待 4.9 小时让所有 32 个作业完成要好。又过了5个小时。注意,我这里随意选了64个职位,如果不特别说明的话,GNU 并行将为您拥有的每个 CPU 核心运行 1 个作业。
有用的附加参数有:
-
parallel --bar ...
给出一个进度条
-
parallel --dry-run ...
进行一次演练,这样您就可以在不实际执行任何操作的情况下了解它会做什么
如果您有多个可用服务器,您可以将它们添加到列表中并GNU 并行也会在他们之间分配工作:
parallel -S server1,server2,server3 ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)