类似的问题是made here,但它们没有解决为什么排序和 awk 之间存在速度差异的原因。
我首先在Unix Stackexchange上提出这个问题但是因为他们告诉我这对Stackoverflow来说是一个很好的问题我会在这里发布。
我需要重复删除大型词汇表。我尝试了几个命令并进行了一些研究here和here,他们解释说重复删除单词表的最快方法似乎是使用awk,因为awk没有对列表进行排序。它使用哈希查找来跟踪项目并删除重复项。由于AWK使用哈希查找,他们认为大O就像这样
awk - > O(n)?
排序 - > O(n log n)?
但是我发现这不是真的。这是我的测试结果。我使用this python script生成了两个随机单词列表。
List1 = 7 Mb
List2 = 690 Mb
测试命令
sort -u input.txt -o output.txt
awk '!x[$0]++' input.txt > output.txt
结果AWK:
的 的List1
真正的0m1.643s
用户0m1.565s
sys 0m0.062s
列表2
真正的2m6.918s
用户2m4.499s
sys 0m1.345s
结果排序:
的 的List1
真实0m0.724s
用户0m0.666s
sys 0m0.048s
列表2
真实1m27.254s
用户1m25.013s
sys 0m1.251s
我一遍又一遍地进行这些测试,并找到了一致的结果。也就是说,SORT快得多。有人可以解释为什么以及是否有更快的方法来做到这一点?
************更新***********
可能导致我的结果有缺陷的事情
答案 0 :(得分:3)
您的示例输入具有重复值的批次;您在样本数量100,000,000中只有1,000,000个不同的值,因此您只希望1%的值是唯一的。我并不确切知道sort -u
是如何工作的,但想象它是一种合并排序,可在每次合并期间过滤唯一值。那么有效输入大小将远小于100,000,000。仅使用1,000,000个值重新运行命令,但从500,000个不同的值中选择(因此50%,而不是1%,预计是唯一的)会产生以下结果:
% time awk '!x[$0]++' randomwordlist.txt > /dev/null
awk ... 1.32s user 0.02s system 99% cpu 1.338 total
% time sort -u randomwordlist.txt -o /dev/null
sort ... 14.25s user 0.04s system 99% cpu 14.304 total
答案 1 :(得分:1)