【问题标题】:Awk slower than lz4 decompressionawk比lz4解压慢
【发布时间】:2020-06-10 00:13:10
【问题描述】:

我有 50 万个文件,每个文件 290 MB,主要由数字组成。 我想(通常)过滤这些数据,但发现 awk 比解压缩慢。 例如,

/usr/bin/time unlz4 bigfile.lz4 --stdout > /dev/null 0.20user 0.05system 0:00.44elapsed 57%CPU

/usr/bin/time unlz4 bigfile.lz4 --stdout | awk '{if ($26>120.) print}' > /dev/null 0.25user 0.25system 0:01.35elapsed 37%CPU

注意事项:

  • 在每次计时之前,我都会清除页面缓存。
  • 输出数据的大小很小且不相关。在这个练习中,输出被完全丢弃。
  • awk 这是 Ubuntu 上的 gawk 5.0.1
  • 尝试使用mawk 而不是awk。这并没有什么不同。
  • 我写了一个用fscanf 读取数据的C 程序。它比awk 慢得多。
  • 我尝试从 HDD 和 SSD 读取。对于两者,awk 都比 unlz4 慢。
  • 每个lz4 文件大约有 66 MB(从 290 MB 压缩而来)。
  • 使用未压缩文件甚至更慢。 cat bigfile | awk '{if ($26>120.) print}' > /dev/null

我的结论是,使用像lz4 这样的快速解压格式,而不是使用更强和更慢的压缩格式并没有帮助,因为即使使用awk 进行最简单的过滤也会成为瓶颈。

有没有人对此有任何见解或聪明的想法?有没有办法加快速度或我达到了物理极限?

【问题讨论】:

  • 你到底对你的数据做了什么?
  • @IgorRivin 最后,我会将/dev/null 替换为output.txt 以存储数据的子集。
  • 不,你在应用什么转换或过滤。
  • @IgorRivin 我想查找第 26 列大于 120 的所有条目。但这只是一个通用示例。我想根据列中的值进行过滤。

标签: awk bigdata throughput lz4


【解决方案1】:

看起来您的文件足够小,以至于启动时间是您运行时的重要贡献者。简单地说,unzl4 | anything > /dev/null 总是会比unlz4 > /dev/null 花费一点时间,因为管道的两端都需要在处理发生之前启动。因此,为管道案例测量更长的时间并不必然意味着消费者比生产者慢,或者你选择的压缩算法无关紧要。如果您想衡量更改压缩算法的影响,请更改压缩算法并进行衡量!

【讨论】:

  • 我已经测试了九种压缩格式,在这个例子中选择了最快的一种。我的问题不是解压,而是解压后如何加快吞吐。
  • 感谢您的评论!我合并了两个 66MB lz4 文件,并测量了解压 + awk 过滤器的时间。它需要两倍的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2016-03-31
  • 2018-05-16
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
相关资源
最近更新 更多