如何使用 GNU Parallel 运行 两个具有不同输入的命令?
How to run two commands with different inputs with GNU Parallel?
我有两个程序有不同的建议,它们的名称如下:
./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 ... ::: $(cat foo)
做:
parallel ... :::: foo
在大多数情况下,这会做你想做的,而第一个可能会导致问题,如果它包含带空格的行。
我假设 PatinN_files.txt 与 PatinN_videos.txt 的行数相同。
通常我会做 2 运行s:trace3-运行 和 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
如果瞬时负载小于cpus数就会启动一个job
我有两个程序有不同的建议,它们的名称如下:
./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 ... ::: $(cat foo)
做:
parallel ... :::: foo
在大多数情况下,这会做你想做的,而第一个可能会导致问题,如果它包含带空格的行。
我假设 PatinN_files.txt 与 PatinN_videos.txt 的行数相同。
通常我会做 2 运行s:trace3-运行 和 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
如果瞬时负载小于cpus数就会启动一个job