并行运行 shell 脚本

2024-11-13 08:36:00
admin
原创
26
摘要:问题描述:我有一个 shell 脚本随机排列一个大型文本文件(600 万行和 6 列)根据第一列对文件进行排序输出 1000 个文件伪代码如下file1.sh #!/bin/bash for i in $(seq 1 1000) do Generating random numbers here ,...

问题描述:

我有一个 shell 脚本

  1. 随机排列一个大型文本文件(600 万行和 6 列)

  2. 根据第一列对文件进行排序

  3. 输出 1000 个文件

伪代码如下

file1.sh 

#!/bin/bash
for i in $(seq 1 1000)
do

  Generating random numbers here , sorting  and outputting to file$i.txt  

done

有没有办法运行这个 shell 脚本parallel来充分利用多核 CPU?

目前,./file1.sh按顺序执行 1 到 1000 次,速度非常慢。

感谢您的帮助。


解决方案 1:

另一个非常方便的方法是使用gnu parallel,如果您还没有安装它,那么非常值得安装;如果任务不一定花费相同的时间,那么它是无价的。

seq 1000 | parallel -j 8 --workdir $PWD ./myrun {}

将启动./myrun 1./myrun 2等,确保一次运行 8 个作业。如果您想同时在多个节点上运行,例如在 PBS 作业中,它还可以获取节点列表;我们为用户提供的有关如何在我们的系统上执行此操作的说明在此处。

更新以添加:您要确保您使用的是 gnu-parallel,而不是 moreutils 包中同名且功能更有限的实用程序(此处描述了两者的不同历史。)

解决方案 2:

检查bash 子 shell,它们可用于并行运行脚本的各个部分。

我还没有测试过这个,但这可能是一个开始:

#!/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

解决方案 3:

要使并行运行,您可以在 shell 命令末尾使用“&”在后台运行它,然后wait默认(即不带参数)等待所有后台进程完成。因此,也许可以并行启动 10 个,然后等待,然后再执行另外 10 个。您可以使用两个嵌套循环轻松完成此操作。

解决方案 4:

GNU parallel 文档中列出了一系列可以从 shell 并行运行作业的程序,甚至还对它们进行了比较。目前有很多解决方案。另一个好消息是,它们在调度作业方面可能非常高效,因此所有核心/处理器始终保持忙碌状态。

解决方案 5:

有一个简单的、可移植的程序可以为您完成这项工作:PPSS。PPSS会检查有多少个核心可用,并在每个任务完成后启动另一个任务,从而自动为您安排任务。

解决方案 6:

虽然以前的答案确实有效,但在我看来它们很难记住(当然 GNU 除外parallel)。

我有点偏爱与上述类似的方法(( $i % 10 == 0 )) && wait。我也见过这样的写法((i=i%N)); ((i++==0)) && wait

其中:
N定义为您想要并行运行的作业数,并且
i是当前作业。

虽然上述方法有效,但其收益递减,因为您必须等待所有进程退出后才能让一组新进程开始工作,这会浪费任何具有任何执行时间的任务(即每个任务)的 CPU 时间。换句话说,在使用前面描述的方法开始新任务之前,并行任务的数量必须达到 0。

对我来说,这个问题在执行执行时间不一致的任务时变得明显(例如,执行从数据库中清除用户信息的请求 - 请求者可能存在也可能不存在,如果存在,则与不同请求者相关的记录可能会有数量级的差异)。我注意到一些请求会立即得到满足,而其他请求则会排队等待一个运行时间稍长的任务成功完成。这意味着一项任务需要数小时/数天才能完成,而之前定义的方法只需要几十分钟。

我认为下面的方法是在没有 GNU 的系统parallel(例如 vanilla macOS)上维持恒定任务加载的更好的解决方案,并且希望比上面的字母汤更容易记住:

WORKER_LIMIT=6 # or whatever - remember to not bog down your system

while read -r LINE; do # this could be any kind of loop
    # there's probably a more elegant approach to getting the number of background processes.
    BACKGROUND_PROCESSES="$(jobs -r | wc -l | tr -d ' ')"

    if [[ $BACKGROUND_PROCESSES -eq $WORKER_LIMIT ]]; then
        # wait for 1 job to finish before starting a new one
        wait -n 
    fi

    # run something in a background shell
    python example.py -item "$LINE" &
done < something.list

# wait for all background jobs to finish
wait

解决方案 7:

IDLE_CPU=1
NCPU=$(nproc)

int_childs() {
    trap - INT
    while IFS=$'
' read -r pid; do
        kill -s SIGINT -$pid
    done < <(jobs -p -r)
    kill -s SIGINT -$$
}

# cmds is array that hold commands
# the complex thing is display which will handle all cmd output
# and serialized it correctly

trap int_childs INT
{
    exec 2>&1
    set -m

    if [ $NCPU -gt $IDLE_CPU ]; then
        for cmd in "${cmds[@]}"; do
            $cmd &
            while [ $(jobs -pr |wc -l) -ge $((NCPU - IDLE_CPU)) ]; do
                wait -n
            done
        done
        wait

    else
        for cmd in "${cmds[@]}"; do
            $cmd
        done
    fi
} | display

解决方案 8:

您可能想看看runp。runp这是一个简单的命令行工具,可以并行运行 (shell) 命令。当您想要一次运行多个命令以节省时间时,它很有用。它很容易安装,因为它是一个二进制文件。它已在 Linux(amd64 和 arm)和 MacOS/darwin(amd64)上进行了测试。

解决方案 9:

生成随机数很容易。假设您有一个像商店数据库这样的大文件,并且想要在某些特定基础上重写该文件。我的想法是计算核心数,将文件拆分成多少个核心,创建一个 script.cfg 文件,split.sh 和 recombine.sh split.sh 会将文件拆分成多少个核心,克隆 script.cfg(更改该大文件中内容的脚本),将 script.cgf 克隆到多少个核心,使它们可执行,在克隆中搜索和替换一些变量,这些变量必须知道要处理文件的哪一部分并在克隆完成后在后台运行它们,生成 clone$core.ok 文件,因此当所有克隆完成后,将告诉循环仅在生成所有 .ok 文件后将部分结果重新组合成一个结果。它可以通过“等待”来完成,但我喜欢我的方式

http://www.linux-romania.com/product.php?id_product=76
看底部,部分翻译成了英语,这样我就能在 2 分钟内处理 20000 篇 16 列的文章(四核),而不是 8 分钟(单核)。你必须关心 CPU 温度,因为所有核心都在 100% 运行

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   609  
  在现代项目管理中,资源的有效利用是确保项目成功的关键因素之一。随着技术的不断进步,越来越多的工具和软件被开发出来,以帮助项目经理和团队更高效地管理资源。本文将介绍10款工具,这些工具可以帮助项目团队提升资源利用效率,从而实现项目目标。禅道项目管理软件禅道项目管理软件是一款开源的项目管理工具,广泛应用于软件开发和其他行业...
项目管理系统   3  
  在项目管理领域,软件工具的不断升级和创新是推动效率和协作的关键。2024年,众多项目管理软件将迎来一系列令人期待的升级功能,这些新特性不仅将提升团队的工作效率,还将增强用户体验和数据分析能力。本文将详细介绍10款项目管理软件的最新升级功能,帮助项目经理和团队成员更好地规划和执行项目。禅道项目管理软件禅道项目管理软件一直...
开源项目管理工具   2  
  信创国产系统的10个关键厂商及其技术生态随着全球信息技术格局的不断演变,信创(信息技术应用创新)产业作为国产化替代的重要阶段,正逐步成为推动我国信息技术自主可控、安全可靠的核心力量。信创产业不仅关乎国家信息安全,也是数字经济高质量发展的关键支撑。本文将深入探讨信创国产系统中的10个关键厂商及其技术生态,分析它们在信创浪...
项目管理流程   0  
  在探讨项目管理的广阔领域中,成功并非偶然,而是精心策划、高效执行与持续优化的结果。项目管理的成功之道,可以从明确的目标设定与规划、高效的团队协作与沟通、以及灵活的风险管理与适应变化这三个核心方面进行深入解析。每个方面都是项目成功的基石,它们相互交织,共同支撑起项目的顺利推进与最终成就。明确的目标设定与规划项目管理的首要...
建筑工程项目管理规范   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用