我对xargs的性能可伸缩性有疑问。目前我有一个用python编写的批处理程序,具有多处理和子进程。每个进程都会生成一个独立的subprocess.popen()来执行外部命令。最近我意识到整个过程可以用xargs重做。但是,我想知道使用xargs处理10k +文件是否是一个好主意,因为我以前从未使用命令行工具做过这种规模。鉴于我对小数据集的测试,如果我所做的只是批量运行一堆命令,实际上并不是一个坏主意,因为它避免了python模块强加的许多周期开销,但我想从任何人那里学到更多东西。可能有更多使用xargs和python的经验。更具体地说,是否需要为xargs配置消耗大量输入的缓冲区限制?谢谢。
答案 0 :(得分:2)
xargs
程序将从标准输入中收集多个参数,并将它们粘合在一起以形成一个长命令行。如果有许多参数,对于一个命令行来说太长,那么它将根据需要构建和执行多个命令行。
这意味着启动进程并关闭它们的开销更少。这对你有多好,取决于你的进程运行多长时间。如果您正在启动某种运行半小时的CPU密集型程序,则该过程的启动时间将无关紧要。如果您正在启动一个运行速度很快的程序,但是您只运行少量实例,那么节省的费用将是无关紧要的。但是,如果你的程序真的很简单并且需要最少的运行时间,那么你可能会发现它有所不同。
从您的问题描述中,它似乎是一个很好的候选人。 10K的东西,每个处理相对较短。 xargs
可能会为你加快速度。
但是,根据我的经验,在shell脚本中做任何重要的工作都会带来痛苦。如果您有任何可以包含空格的目录名称或文件名,引用变量时最轻微的错误会导致脚本崩溃,因此您需要痴迷地测试脚本以确保它适用于所有可能的输入。出于这个原因,我在Python中使用了非常重要的系统脚本。
因此,如果你已经在Python中使用你的程序,恕我直言,你会疯狂地尝试将它重写为shell脚本。
现在,如果需要,您仍然可以使用xargs
。只需使用subprocess
运行xargs
并通过标准输入传递所有参数。这样可以获得所有的好处,而不是痛苦。您可以使用Python在每个参数的末尾粘贴一个NUL字节chr(0)
,然后使用xargs --null
,它将具有强大的文件名,其中包含空格。
或者你可以使用' '.join()
来构建你自己很长的命令行,但是当你可以按照上面的描述运行xargs
时,我认为没有任何理由这样做。