1

我对 xargs 的性能可扩展性有疑问。目前我有一个用python编写的带有多处理和子进程的批处理程序。每个进程产生一个独立的 subprocess.popen() 来执行外部命令。最近我意识到整个过程可以用 xargs 重做。但是,我想知道使用 xargs 处理 10k+ 文件是否是一个好主意,因为我以前从来没有只用命令行工具完成过这种规模的事情。鉴于我对小数据集的测试,如果我所做的只是批量运行一堆命令,这实际上不是一个坏主意,因为它避免了 python 模块带来的许多循环开销,但我想从任何人那里学到更多可能对 xargs 和 python 有更多的经验。进一步来说,是否需要为 xargs 配置任何缓冲区限制以消耗大量输入?谢谢。

4

1 回答 1

2

xargs程序将从标准输入中收集多个参数,并将它们粘合在一起以形成一个长命令行。如果有很多很多参数,对于一个命令行来说太长,那么它将构建和执行多个命令行,根据需要。

这意味着启动和关闭进程的开销更少。这对您有多大好处取决于您的流程运行多长时间。如果您正在启动某种将运行半小时的 CPU 密集型程序,则该进程的启动时间将无关紧要。如果您正在启动一个运行速度很快的程序,但您只运行少量实例,那么节省的成本将是无关紧要的。但是,如果您的程序真的很简单并且需要最少的运行时间,那么您可能会注意到不同之处。

从您的问题描述来看,它似乎是一个很好的候选者。10K 个事物,每个事物的处理时间相对较短。 xargs可能会为您加快速度。

然而,根据我的经验,在 shell 脚本中做任何重要的工作都会带来痛苦。如果您有任何目录名或文件名中可以​​包含空格,那么在引用变量时最轻微的错误都会使您的脚本崩溃,因此您需要对您的脚本进行痴迷的测试,以确保它适用于所有可能的输入。出于这个原因,我在 Python 中编写了重要的系统脚本。

因此,如果您已经让您的程序在 Python 中运行,恕我直言,如果您尝试将其重写为 shell 脚本,您会很疯狂。

现在,您仍然可以xargs根据需要使用。只需用于subprocess运行xargs并通过标准输入传递所有参数。这获得了所有的好处,没有痛苦。chr(0)您可以使用 Python在每个参数的末尾添加一个 NUL 字节,然后使用xargs --null,它对于包含空格的文件名将是健壮的。

或者,您可以使用' '.join()构建自己的非常长的命令行,但是当您可以xargs按照上述方式运行时,我认为没有任何理由这样做。

于 2013-10-25T03:39:53.290 回答