7

在我的 Web 应用程序中,我使用 PHP 脚本呈现页面,然后从中生成静态 HTML 文件。将静态 HTML 提供给用户以提高性能。HTML 文件最终会变得陈旧,需要删除。

我正在讨论两种编写驱逐脚本的方法。

第一种是使用单个查找命令,例如

find /var/www/cache -type f -mmin +10 -exec rm \{} \;

第二种形式是通过 xargs 管道,类似于

find /var/www/cache -type f -mmin +10 -print0 | xargs -0 rm

第一种形式rm为它找到的每个文件调用,而第二种形式只是将所有文件名发送到单个rm(但文件列表可能很长)。

哪种形式会更快?

就我而言,缓存目录在几个 Web 服务器之间共享,所以这一切都是通过 NFS 完成的,如果这对这个问题很重要的话。

4

4 回答 4

20

xargs 版本在处理大量文件时比您发布的 -exec 版本要快得多,这是因为对于您要删除的每个文件rm执行一次,而 xargs 会将尽可能多的文件集中到一个命令中。rm

对于数万或数十万个文件,它可能是一分钟或更短时间与一小时的大部分时间之间的差异。

通过使用“+”而不是“\;”结束命令,您可以使用 -exec 获得相同的行为。此选项仅在较新版本的find.

以下两个大致等价:

find . -print0 | xargs -0 rm
find . -exec rm \{} +

请注意,该xargs版本在多处理器系统上的运行速度仍然会稍微快一些(提高几个百分点),因为某些工作可以并行化。如果涉及大量计算,则尤其如此。

于 2009-11-15T01:38:26.023 回答
6

我希望 xargs 版本会稍微快一些,因为您没有为每个文件名生成一个进程。但是,如果实际上在实践中有很大差异,我会感到惊讶。如果您担心 xargs 发送给每个 rm 调用的长列表,您可以使用 -l 和 xargs 来限制它将使用的令牌数量。但是, xargs 知道最长的 cmdline 长度并且不会超出此范围。

于 2009-06-11T12:48:43.937 回答
2

find 命令有一个内置的 -delete 选项,也许这也有用? http://lists.freebsd.org/pipermail/freebsd-questions/2004-July/051768.html

于 2011-03-01T01:52:53.123 回答
1

与使用 find 的 exec 相比,使用 xargs 更快。

我尝试使用 xargs 和 exec 计算 node_module 文件夹中带有 js 扩展名的文件中的行数。所以下面的输出。

time find . -type f -name "*.js" -exec wc -l {} \;

real    0m0.296s
user    0m0.133s
sys     0m0.038s

time find . -type f -name "*.js" |xargs wc -l
real    0m0.019s
user    0m0.005s
sys     0m0.006s

xargs 的执行速度比 exec 快大约 15 倍。

于 2020-05-03T15:27:33.553 回答