并行运行 shell 脚本

2024-11-13 08:36:00
admin
原创
177
摘要:问题描述:我有一个 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% 运行

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用