awk - awk比lz4解压慢
问题描述
我有 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
这是gawk 5.0.1
在 Ubuntu 上。 - 尝试
mawk
代替awk
. 这并没有什么不同。 - 我写了一个 C 程序来读取数据
fscanf
。它明显慢于awk
. - 我尝试从 HDD 和 SSD 读取。
awk
比unlz4
两者都慢。 - 每个
lz4
文件大约有 66 MB(从 290 MB 压缩)。 - 使用未压缩的文件甚至更慢。
cat bigfile | awk '{if ($26>120.) print}' > /dev/null
我的结论是,使用快速解压缩格式(而不是更强大和更慢的压缩格式)并没有帮助lz4
,因为即使是最简单的过滤awk
也会成为瓶颈。
有没有人对此有任何见解或聪明的想法?有没有办法加快速度或者我达到了物理极限?
解决方案
看起来您的文件足够小,以至于启动时间是您运行时的重要贡献者。简而言之,unzl4 | anything > /dev/null
总是会比unlz4 > /dev/null
因为管道的两端都需要在处理发生之前启动。因此,为管道情况测量更长的时间并不一定意味着消费者比生产者慢,或者您选择的压缩算法无关紧要。如果您想衡量更改压缩算法的影响,请更改压缩算法并进行衡量!
推荐阅读
- spring-data-elasticsearch - 升级到spring boot 2.2.X后的MappingException(Attempt to add id)
- select - DataList:如何隐藏查找值?
- apache-arrow - 如何在 Apache Arrow 中对数据进行排序
- python - 如何根据底图上的地理坐标指向箭头框?
- arrays - 如何对javascript中的每个项目求和
- javascript - Js推入数组,该数组位于具有多个数组的对象中
- botframework - Microsoft 网络聊天自动滚动
- javascript - SHA256 Hashing Large files in angular 6 using Filereader Issue
- python - 简化 main1.py 或 main2.py 调用 middle.py 调用 sub1.py 或 sub2.py
- node.js - 无法在 NodeJS 应用程序中的 Heroku 上添加 npm 模块