4

我有一个脚本可以运行一些数据处理命令 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++ 领域。

谢谢

问候

4

4 回答 4

6

将文件列表通过管道传输到

xargs -n 1 -P 16 mycmd

例如:

echo folderName/input*.txt | xargs -n 1 -P 16 mycmd
于 2012-06-02T00:42:13.853 回答
1

使用以下应用程序之一可能还有其他一些解决方案:

xjobs

平行线

PPSS - 并行处理 Shell 脚本

运行参数文件

于 2012-06-02T07:17:33.260 回答
0

batch用;提交工作 这应该可以解决负载平衡和资源不足的问题。

for f in folderName/input.*; do
    batch <<____HERE
        mycmd "$f"
____HERE
done

(不能 100% 确定报价是否正确和/或有用。)

于 2012-06-02T07:20:13.017 回答
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

或者,如果您的系统缺少“make”,您可以简单地将 src/parallel src/sem src/niceload src/sql 复制到路径中的目录。

= 最少安装 =

如果您只需要并行并且没有安装“make”(可能系统是旧的或 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

于 2013-03-12T15:33:12.860 回答