【问题标题】:Looking for an AWK alternative to speed up this command寻找一个 AWK 替代品来加速这个命令
【发布时间】:2020-03-04 08:17:24
【问题描述】:

我一直在使用 AWK 执行此命令,但它太慢了。

必须有一种更快的方法来处理来自aws s3 ls command 的此列表

s5cmd ls s3://bucket-name/* | awk -v AWS_BUCKET="bucket-name" '{cmd="aws s3api put-object-acl --access-control-policy file:///access_policy.json --bucket " AWS_BUCKET " --key "$5; system(cmd); print $5}'

这基本上列出了所有对象,然后对它们应用 ACL。

有什么想法吗?

【问题讨论】:

  • 恕我直言,我不是parallel 命令(GNU 实用程序)方面的专家,但您可以通过并行启动命令来使用它,如果您也可以在这个问题中添加该标签你没问题。
  • 为什么这可能会很慢,因为您将输出从一个命令传递到另一个命令,然后为前一个命令的每一行输出运行另一组命令是一个子 shell(因为您使用的是系统)
  • 这就是它慢的原因,有什么替代方案吗?
  • 我同意 Ravnider 的观点:我会删除 amazon-web-services(或其中一个)的标签并替换为 gnu-parallel,这样您就可以找到专门使用此工具的人看看你的 Q。这假设你的乘法任务不会相互干扰。祝你好运。
  • 而且,这不是 awk 的错。除非您有一种可以并行运行/管理多个程序的编程语言,否则您将受到时间限制,依次执行每个程序,每个程序都等待前一个程序完成。 (你可能知道 ;-) )。您可以使用 GlennJackmans 的想法,但在每个 cmd 字符串的末尾添加一个&,然后所有将在后台并行运行,但不会很好地管理。祝你好运。

标签: bash amazon-s3 awk aws-cli gnu-parallel


【解决方案1】:

您可能只想打印所有命令,然后将输出通过管道传输到sh 以执行它们,而不是为每一行执行system(cmd)

s5cmd ls s3://bucket-name/* |
  awk -v AWS_BUCKET="bucket-name" -v '{
    printf "aws s3api put-object-acl --access-control-policy file:///access_policy.json --bucket %s --key %s\n", AWS_BUCKET, $5
  }' |
  sh

你有那个流浪的-v。我认为这是一个错字,或者您删除了一些敏感内容。

【讨论】:

  • 这感觉和原来的速度差不多,不幸的是:(
  • 我猜它的作用是一样的:sh 进程会一一执行。节省的是只有一个sh进程,而不是每行一个。有多少?
  • 感谢您回复我,有成千上万个!
  • 尝试将 sh 更改为 parallel -j 8parallel -j 32 以一次运行 32 个。
  • 与 aws put 命令的时间相比,进程的启动时间显然相形见绌。
【解决方案2】:

对我来说,答案是两个答案的组合

s5cmd ls s3://bucket-name/* |
  awk -v AWS_BUCKET="bucket-name" '{
    printf "aws s3api put-object-acl --access-control-policy file:///access_policy.json --bucket %s --key %s\n", AWS_BUCKET, $5
  }' |
  parallel -j 32

这大大加快了这个命令的速度,感谢 Glenn Jackman 和 Mark Setchell

【讨论】:

  • 干得好,感谢您与 Stack Overflow 社区的分享。在 GNU Parallel 手册页和教程上花费 10 分钟 - 在这些多核 CPU 时代非常值得。还要检查--progress--bar--eta 开关。
猜你喜欢
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多