现在我使用
Linux来执行以下任务:
while read parameter do ./program_a $parameter $parameter.log 2>&1 & done < parameter_file
每个参数指的是要处理的文件的名称.每个文件包含要处理的不同行数.
例如:
参数文件包含:
File_A File_B File_C
File_A包含1k行,File_B包含10k行,File_C包含1000k行,这意味着在上面的脚本中program_a分别同时处理1000行,10k行和1000k行.每个任务的处理时间几乎线性地取决于行数,每个任务是独立的.
我有6核CPU和12个线程.因为处理时间可能不同,所以在运行File_A和File_B的任务之后,只有一个核心将处理File_C的任务.这是在浪费资源.
我想将每个文件拆分为1k行并同时运行它们.但是对于这个例子,将运行1011个任务(每个任务1k).我认为这将导致严重的上下文切换问题.也许我可以调整每行中的数字来解决这个问题,但我不认为这是一个很好的解决方案.
我的想法是限制运行的任务将始终是6个任务,这意味着始终使用最大数量的核心来运行并将上下文切换减少到尽可能少.但我不知道如何修改我的脚本来实现这个目标.有人可以给我一些建议吗?
解决方法
我不会尝试通过拆分文件来重新发明负载平衡轮.使用gnu parallel来处理不同规模任务的管理.它有很多选项可以在一台或多台机器上并行执行.如果将其设置为,例如,并行允许4个进程,它将执行此操作,在较短的进程完成时启动新任务.
https://www.gnu.org/software/parallel/
https://www.gnu.org/software/parallel/parallel_tutorial.html
这是一个简单的例子,使用cat作为./program的代表:
...write a couple of files % cat > a a b c % cat > b a b c d % cat > files a b ... run the tasks % parallel cat {1} \> {1}.log < files % more b.log a b c d