【发布时间】:2015-11-27 00:25:34
【问题描述】:
类似的问题是made here,但他们没有说明为什么 sort 和 awk 之间存在速度差异。
我首先在Unix Stackexchange 上提出了这个问题,但由于他们告诉我这对于 Stackoverflow 来说是一个很好的问题,所以我会在这里发布。
我需要对一个大的单词表进行重复数据删除。我尝试了几个命令,并做了一些研究here 和here,他们解释说,删除单词列表的最快方法似乎是使用 awk,因为 awk 不会对列表进行排序。它使用哈希查找来跟踪项目并删除重复项。由于 AWK 使用哈希查找,他们认为大 O 是这样的
awk --> O(n) ?
排序 --> O(n log n) ?
但是我发现这不是真的。这是我的测试结果。我使用this python script 生成了两个随机词表。
列表 1 = 7 Mb
列表 2 = 690 Mb
测试命令
sort -u input.txt -o output.txt
awk '!x[$0]++' input.txt > output.txt
结果 AWK:
List1
真正的 0m1.643s
用户 0m1.565s
系统 0m0.062s
列表2
真正的 2m6.918s
用户 2m4.499s
系统 0m1.345s
结果排序:
List1
真正的 0m0.724s
用户 0m0.666s
系统 0m0.048s
列表2
真正的 1m27.254s
用户 1m25.013s
系统 0m1.251s
我一遍又一遍地进行这些测试,并发现了一致的结果。也就是说,SORT 要快得多。有人可以解释为什么以及是否有更快的方法吗?
************ 更新 ***********
可能影响我的结果的事情是强>
- 缓存:我已经通过更改顺序排除了这种可能性 在测试中执行
- 大 O 符号的常数因子。我认为由于单词列表的大小,它们此时应该变得无关紧要。 (600Mb)
- 算法的错误实现:这仍有可能我没有检查 awk 和 sort 的源代码
【问题讨论】:
-
n在每种情况下是什么?如果您尝试对n的许多不同值进行此操作,您是否看到awk的运行时间线性增加,或者sort的增加为n lg n? -
您的列表可能有些特别之处。对我来说,
awk按我的预期获胜。试试shuf /usr/share/dict/words > unsorted; time sort -u unsorted -o sort-sorted; time awk '!x[$0]++' unsorted > awk-sorted -
将您的 awk 代码添加到您的问题中。
-
您的测试数据有 很多 个重复项(预计为 99%),
sort -u可以比最坏的情况更有效地处理这些数据。使用来自 500,000 个不同值的 1,000,000 个随机值(而不是来自 1,000,000 个不同值的 100,000,000 个随机值)进行测试,awk的速度几乎快了 14 倍。 -
这个问题已经被问过很多次了。这里有一些额外的策略:stackoverflow.com/q/30906191/1172700
标签: bash sorting unix awk processing-efficiency