我有一个shell脚本
所以伪代码看起来像这样
file1.sh
#!/bin/bash
for i in $(seq 1 1000)
do
Generating random numbers here , sorting and outputting to file$i.txt
done
有没有办法在parallel
中运行此shell脚本以充分利用多核CPU?
目前,。/file1.sh
按顺序执行1到1000次运行并且非常慢。
感谢您的帮助。
答案 0 :(得分:85)
另一个非常方便的方法是使用gnu parallel,如果您还没有它,那么非常值得安装;如果任务不一定花费相同的时间,这是非常宝贵的。
seq 1000 | parallel -j 8 --workdir $PWD ./myrun {}
将启动./myrun 1
,./myrun 2
等,确保一次运行8个作业。如果要一次在多个节点上运行,例如在PBS作业中,它也可以采用节点列表;我们对用户如何在我们的系统上执行此操作的说明为here。
已更新以添加:您希望确保使用的是gnu-parallel,而不是更多有限的更多限制实用程序,这些实用程序位于moreutils包中(两者的不同历史记录是描述here。)
答案 1 :(得分:42)
签出bash subshells,这些可以用来并行运行部分脚本。
我没有对此进行测试,但这可能是一个开始:
#!/bin/bash
for i in $(seq 1 1000)
do
( Generating random numbers here , sorting and outputting to file$i.txt ) &
if (( $i % 10 == 0 )); then wait; fi # Limit to 10 concurrent subshells.
done
wait
答案 2 :(得分:13)
要让事情并行运行,请使用'&'在shell命令的末尾,在后台运行它,然后wait
将默认(即没有参数)等待所有后台进程完成。所以,也许可以并行启动10,然后等待,然后再做10次。您可以使用两个嵌套循环轻松完成此操作。
答案 3 :(得分:9)
有一个whole list of programs可以在shell中并行运行作业,甚至包括它们之间的比较,在GNU parallel的文档中。那里有很多很多解决方案。另一个好消息是,它们在调度作业方面可能非常有效,因此所有核心/处理器始终处于忙碌状态。
答案 4 :(得分:4)
有一个简单的便携式程序可以为您完成此任务:PPSS。 PPSS会自动为您调度作业,方法是检查可用的核心数量,并在每次完成另一个作业时启动另一个作业。
答案 5 :(得分:0)
byte[]secretKeyByteArray = Convert.FromBase64String(apiKey);
答案 6 :(得分:0)
您可能想看看runp。 runp
是一个简单的命令行工具,可并行运行(shell)命令。当您想一次运行多个命令以节省时间时,这很有用。它是单个二进制文件,因此易于安装。已经在Linux(amd64和arm)和MacOS / darwin(amd64)上进行了测试。
答案 7 :(得分:-2)
生成随机数很容易。 假设你有一个巨大的文件,如商店数据库,你想在某些特定的基础上重写该文件。 我的想法是计算核心数,将文件分成多少个核心,制作一个script.cfg文件,split.sh和recombine.sh split.sh将拆分文件中的多少个核心,克隆script.cfg(更改那些巨大文件中的东西的脚本),克隆script.cgf中的内核数量,使它们可执行,在克隆中搜索和替换一些必须知道的变量要处理的文件的哪个部分 并在后台运行它们 当一个克隆完成后,生成一个克隆$ core.ok文件,所以当完成所有克隆时,只有在生成所有.ok文件时,才会告诉循环将部分结果重新组合成一个。 它可以通过“等待”完成,但我喜欢我的方式
http://www.linux-romania.com/product.php?id_product=76 看看底部,部分翻译成EN 通过这种方式,我可以在2分钟(四核)而不是8(单核)中获得20000篇16列的文章 您必须关心CPU温度,因为所有核心都在100%运行