我正在通过GNU Parallel教程工作。在“多个参数”部分中,有以下示例(注意:num30000是一个文本文件,其顺序行上的数字为1到30,000):
为了获得更好的并行性,当满足文件结尾时,GNU Parallel可以在所有并行作业之间分配参数。
并行运行4个作业会将参数的最后一行拆分为4个作业,从而导致总共5个作业:
Run Code Online (Sandbox Code Playgroud)cat num30000 | parallel --jobs 4 -m echo | wc -l输出:
Run Code Online (Sandbox Code Playgroud)5
我的问题是:为什么我们期望有5个职位?尽管我不知道这很重要,但我显然遗漏了一点。我预计会有4个工作,因为30,000被4整除。我决定运行以下命令后发布此问题:
cat num30000 | parallel --jobs 4 -m echo | colrm 12
Run Code Online (Sandbox Code Playgroud)
结果是:
1 2 3 4 5 6
23696 23697
25273 25274
26850 26851
28427 28428
Run Code Online (Sandbox Code Playgroud)
在我看来,这就像第一个echo命令传递了前23695个参数一样。然后,将剩余的工作分解为另外4个作业,其参数计数分别为1577、1577、1577和1574。我是否误解了对parallel的调用应该做什么?谢谢!
您为这个答案付出的代价是帮助我以某种方式改进示例,以便您在初读时会理解它。
因此,发生了以下情况:
GNU Parallel计算出限制为131071。然后它查看当前正在运行多少作业(0)。小于要并行运行的作业数(4):然后,读取高达131071限制的参数并启动该作业。这是第一份工作。
现在,GNU Parallel再次读取参数。这次它将读取所有其余内容并到达文件末尾。“哦,” GNU Parallel认为。“如果这是文件的结尾,那么我将所有参数散布在所有作业插槽(4)上。” 因此,它将所有其余的论点分散到4个工作中。然后启动3个作业。现在有4个作业正在运行。
其中一个正在运行的作业完成,并提供了一个空闲的作业位;因此GNU Parallel开始了最后的工作。
如果您有4个内核和100个参数,则这种设计的原因更加清楚:100个参数很容易放在一行上,但是通常在4核计算机上运行带有25个参数的4个作业将比运行100个参数的1个作业更快。 args。