在许多输入上运行程序的工具
项目描述
每个都是一个 shell 命令,用于运行健壮的、并行的、具有良好反馈机制的 for 循环。
它针对“中等规模”实验进行了优化,这些实验有点太小而且是临时性的,无法在合适的集群上运行(或者你可能只是没有合适的集群。我没有),但是速度太慢以至于重新启动它们从头开始会很痛苦,而且理想情况下,足够并行,如果你碰巧有一个 16 核服务器在周围运行它们,你真的想使用所有 16 个核。
每个的主要用途是以下 bash for 循环的更健壮版本:
for f in "$source"/* ; do
DEST="$destination"/$(basename $f)
mkdir -p "$DEST"
"$command" < "$f" > "$DEST/out" 2> "$DEST/err"
echo $? > "$DEST/status"
done
可以使用 each 编写相同的内容,如下所示:
each "$source" "$command" --destination="$destination"
除了更短、更易读之外,用每个写这个可以让你:
自动并行。您可以使用--processes=n控制运行多少进程,但它默认使用除一个可用内核之外的所有内核(或单核机器上的一个内核)。
自动恢复 - 如果每个都死了,当它下次启动时,它将从停止的地方恢复。
对进度的反馈,以及对流程何时完成的良好预测分析(仍在进行中,但基础知识已经存在)。
稍后您还将获得重试错误的良好逻辑,但我还没有写那一点。
每个都还处于早期阶段,所以它可能有一些粗糙的边缘,但它经过了很好的测试,已经让我的生活变得更好了。
用法
用法是:
each some-input-directory 'some command to run' --destination="output directory"
命令可以是任意的 shell 命令(默认情况下将由$SHELL -c 'some command to run' 运行)。
默认情况下,文件的内容将被传递到子进程的标准输入。如果要按名称传递文件,可以使用特殊字符串{}。如果这样做,将用要处理的文件替换它(使用它的绝对路径名)并且 stdin 将为空。
每个--help都提供了更高级的使用选项。
常见问题
为什么?
我有一堆实验,基本上是“在每个文件上运行这个长时间运行的任务”,这些任务具有不同程度的脆弱性,我一直发现自己写的版本不好,所以我想我会解决这个问题一次并为所有人。
bash 循环版本的主要功能:
您不会冒险学习如何编写比您想要的更多的 bash。
如果你杀死它,它会从它停止的地方恢复。
自动并行
你会得到一个很酷的进度条。
当我开始编写更好的重试功能时,您将免费获得这些功能。
我该如何安装它?
pip install each
它在什么上运行?
可能是什么unixy。我已经在 Linux(包括 WSL,Windows 10 Linux 子系统)上开发和测试了它,但它很可能在未经修改的情况下在 OSX 上工作。它不太可能在 Windows 上运行。如果有人想贡献它,我不反对 Windows 支持,但我不会自己编写它,它是一种相当统一的工具。
我应该使用这个吗?
嗯,也许吧。我发现它很有帮助,但它可能对我的使用非常特殊。
如果您尝试了它但对您不起作用,请提出问题或进行 PR。我很高兴它普遍有用,但我不打算投入大量时间来支持它。
你会让它在 Python 2 上运行吗?
不。
你会在更宽松的许可下发布它吗?
也没有。
我不喜欢这些答案。我应该改用什么?
我不知道。也许bashreduce?