【发布时间】: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