【问题标题】:How to run two commands with different inputs with GNU Parallel?如何使用 GNU Parallel 运行具有不同输入的两个命令?
【发布时间】:2017-01-16 19:34:34
【问题描述】:

我有两个具有不同提议的程序,它们的名称如下:

./FolderCounter <PATH TO FOLDER> traceX
./VideoCounter <PATH TO VIDEO> traceY

运行这些应用程序我有以下使用 GNU 并行的命令:

parallel ./FolderCounter {} trace3 ::: $(cat PatinN_files.txt) &> data_output/Result_PatinN_files.txt
parallel ./FolderCounter {} trace5 ::: $(cat PatinS_files.txt) &> data_output/Result_PatinS_files.txt
parallel ./VideoCounter  {} trace3 ::: $(cat PatinN_videos.txt) &> data_output/Result_PatinN_video.txt
parallel ./VideoCounter  {} trace5 ::: $(cat PatinS_videos.txt) &> data_output/Result_PatinS_video.txt

我的目标是将这四行合并为一个 GNU 并行命令,以便它可以更好地管理并行作业的数量,并在有可用处理器时立即启动下一批文件。

我该怎么做?

【问题讨论】:

    标签: parallel-processing gnu-parallel


    【解决方案1】:

    第一:不要这样做:

    parallel ... ::: $(cat foo)
    

    做:

    parallel ... :::: foo
    

    在大多数情况下,这将满足您的要求,而第一个可能会导致问题,如果它包含带空格的行。

    我假设 PatinN_files.txt 的行数与 PatinN_videos.txt 相同。

    通常我会运行 2 次:trace3-run 和 trace5 运行:

    parallel ./FolderCounter {1} trace3 ";" ./VideoCounter {2} trace3  ::::+ PatinN_files.txt PatinN_videos.txt &> data_output/Result_PatinN.txt
    parallel ./FolderCounter {1} trace5 ";" ./VideoCounter {2} trace5  ::::+ PatinS_files.txt PatinS_videos.txt &> data_output/Result_PatinS.txt
    

    或者,您可以简单地使用 GNU Parallel 首先生成所有要运行的命令,然后再运行它们(这不需要 txt 文件具有相同的行数):

    (
     parallel --dry-run ./FolderCounter {} trace3 :::: PatinN_files.txt
     parallel --dry-run ./FolderCounter {} trace5 :::: PatinS_files.txt
     parallel --dry-run ./VideoCounter  {} trace3 :::: PatinN_videos.txt
     parallel --dry-run ./VideoCounter  {} trace5 :::: PatinS_videos.txt
    ) | parallel &> data_output/Result.txt
    

    要跟踪哪个输入生成什么输出,请使用:

    ) | parallel --tag &> data_output/Result.txt
    

    将日志输出到 4 个不同的文件中有点困难。如果确实需要,可以这样做,但不如上面的那么优雅。

    如果你只是想在有空闲 cpu 空闲的情况下运行作业,你可以使用--load 100%:

    parallel --load 100% ./FolderCounter {} trace3 ::: $(cat PatinN_files.txt) &> data_output/Result_PatinN_files.txt &
    parallel --load 100% ./FolderCounter {} trace5 ::: $(cat PatinS_files.txt) &> data_output/Result_PatinS_files.txt &
    parallel --load 100% ./VideoCounter  {} trace3 ::: $(cat PatinN_videos.txt) &> data_output/Result_PatinN_video.txt &
    parallel --load 100% ./VideoCounter  {} trace5 ::: $(cat PatinS_videos.txt) &> data_output/Result_PatinS_video.txt &
    wait
    

    如果即时负载小于cpu数量,它会启动一个作业。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多