xarg与python多处理的性能+;子流程

xarg与python多处理的性能+;子流程,python,unix,multiprocessing,xargs,Python,Unix,Multiprocessing,Xargs,我对xargs的性能可伸缩性有一个问题。目前,我有一个用python编写的批处理程序,带有多处理和子进程。每个进程生成一个独立的subprocess.popen()来执行外部命令。最近我意识到整个过程可以用xargs重做。然而,我想知道使用xargs来处理10k+文件是否是一个好主意,因为我以前从未用命令行工具做过如此大规模的事情。考虑到我对小数据集的测试,如果我所做的只是批量运行一组命令,这其实不是一个坏主意,因为它避免了python模块强加的许多开销循环,但我想向任何可能有更多xargs和p

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

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

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

从您的问题描述来看,它似乎是这方面的一个很好的候选者。10000件,每件处理时间相对较短
xargs
可能会加快速度

然而,根据我的经验,在shell脚本中做任何不平凡的工作都会带来痛苦。如果您的目录名或文件名中有空格,引用变量时出现的任何错误都会导致脚本崩溃,因此您需要对脚本进行严格测试,以确保它对所有可能的输入都有效。出于这个原因,我用Python编写了一些重要的系统脚本

因此,如果您的程序已经在Python中运行,那么尝试将其重写为shell脚本将是疯狂的

现在,如果需要,您仍然可以使用
xargs
。只需使用
subprocess
运行
xargs
并通过标准输入传递所有参数。这带来了所有的好处,却没有带来任何痛苦。您可以使用Python在每个参数的末尾粘贴一个NUL字节
chr(0)
,然后使用
xargs--null
,这样对于包含空格的文件名来说,它将非常健壮


或者,您可以使用
'.join()
来构建自己的很长的命令行,但我看不出有任何理由这样做,因为您可以如上所述运行
xargs

“如果你有两匹马,你想知道这两匹马中哪一匹跑得更快,那就去比赛吧。不要写马的简短描述,把它们发布在互联网上,让随机的陌生人猜哪个更快!“我猜,
xargs
子流程
的成本将非常小,以至于您不会注意到差异。或者,如果存在差异,则更多的是关于哪个参数集的分区最好,而不是哪个参数的开销最小。但正如Christian Temus所说,为什么要猜测您何时能够真正知道答案?我不是随便问陌生人,而是问那些可能有类似问题经验的人。无论如何,谢谢你抽出时间。是的,我已经在用其中一个操作做subprocess+xargs方法了。操作本身非常简单,花费不到1秒。我想这不是一个操作问题,但就规模而言,我还没有找到任何方法记录xargs是否有任何输入限制。它看起来只是围绕输入包装了一个循环,并且能够成批执行命令。它是否依赖于我需要配置的缓冲区之类的东西来使用一长串输入?我的理解是,xargs只是不断使用标准输入的参数并添加em命令行,直到该行遇到限制或标准输入耗尽。一旦达到限制,它将运行该命令,然后开始构建另一个要运行的命令行。有一个选项可以让您设置限制,但我认为内置的默认命令行运行得很好。因此xargs可以处理任意数量的输入参数s、 但是当这种情况发生时,可能会多次执行它的命令。这里的更多信息:是的,我昨天读过。所以我在做一个find | xargs类型的操作,我对是否需要-s或-L标志(字符限制与行限制)有点困惑好吧,我认为你真的不需要-s或-L标志。只需使用内置默认值进行尝试,看看它是如何运行的。除非你用xargs调用的程序对它可以处理的命令行长度有一个不寻常的限制,否则你不必担心它。