我有一个运行一些数据处理命令10K次的脚本。
foreach f (folderName/input*.txt)
mycmd $f
end
我已将每个“mycmd $ f”的运行时间定为0.25秒。 通过10K运行,它总计超过1小时。 我在16核nehalem上运行它。 如果不在其余15个核心上运行,那将是一个巨大的浪费。
我试过&有了睡眠,不知何故,脚本会在3900次迭代时死于警告或错误,见下文。睡眠时间越短,死亡的速度越快。
foreach f (folderName/input*.txt)
mycmd $f & ; sleep 0.1
end
必须有更好的方法。 注意:我更喜欢shell脚本解决方案,让我们不要徘徊在C / C ++领域。
由于
此致
答案 0 :(得分:6)
将文件列表传送到
xargs -n 1 -P 16 mycmd
例如:
echo folderName/input*.txt | xargs -n 1 -P 16 mycmd
答案 1 :(得分:1)
答案 2 :(得分:0)
使用batch
提交作业;这应该可以解决负载平衡和资源匮乏问题。
for f in folderName/input.*; do
batch <<____HERE
mycmd "$f"
____HERE
done
(不是100%确定报价是否正确和/或有用。)
答案 3 :(得分:0)
使用GNU Parallel,您可以:
parallel mycmd ::: folderName/input*.txt
来自:http://git.savannah.gnu.org/cgit/parallel.git/tree/README
=完全安装=
完全安装GNU Parallel非常简单:
./configure && make && make install
如果您不是root用户,可以在路径中添加〜/ bin并安装 〜/ bin和〜/ share:
./configure --prefix=$HOME && make && make install
或者,如果您的系统缺少“制作”。你可以简单地复制src / parallel src / sem src / niceload src / sql到你路径中的一个目录。
=最小安装次数=
如果你只是需要并行而没有制作&#39;安装(也许是 系统是旧的或Microsoft Windows):
wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem
mv parallel sem dir-in-your-$PATH/bin/
观看介绍视频以获得快速介绍: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1