1. 程式人生 > >如何高效地做到大文字去除重複行

如何高效地做到大文字去除重複行

如果只是去重,用sort的效率很低(指的是上千萬行的量級),因為做了額外操作,因為你只是要去重,而不是排序


用awk陣列來實現很簡單很快,利用了awk陣列是hashtable實現的特性。記憶體佔用和去重後(注意是去重後)的行數(注意是行數,而不是你的文字內容)成正比。


cat 一堆檔案 | awk '{ if (!seen[$0]++) { print $0; } }'


來個實際的測試結果吧,取100w 不重複的URL,簡單複製一份,形成一個200w行的檔案(請原諒我不能拿幾億的數量做測試,因為sort實在太慢了,上面說可以接受的肯定是沒有測試過。。)


$ wc -l 200w
2000000 200w
$ tail -1 200w
http://photo.blog.sina.com.cn/photo/511c583f448cc39a9cb5c


$ time cat 200w | sort | uniq > sort_uniq
cat 200w 0.01s user 0.08s system 0% cpu 21.844 total
sort 35.13s user 0.24s system 76% cpu 46.279 total
uniq > sort_uniq 21.43s user 0.17s system 46% cpu 46.278 total


sort && uniq 耗時 46s,並且會打滿一個CPU核


$ time cat 200w | sort -u > sort_u
cat 200w 0.01s user 0.08s system 0% cpu 24.806 total
sort -u > sort_u 47.56s user 0.31s system 99% cpu 48.002 total


** sort -u 耗時48s,差不多吧 **


$ time cat 200w | awk '{ if (!seen[$0]++) { print $0; } }' > awk
cat 200w 0.01s user 0.08s system 3% cpu 3.144 total
awk '{ if (!seen[$0]++) { print $0; } }' > awk 2.83s user 0.23s system 96% cpu 3.158 total


awk 方法耗時3s , 而且最重要的awk方法的時間複雜度是O(n), sort是O(nlogn),200w就差這麼大,2000w呢,2億麼,可想而知
轉自:http://segmentfault.com/q/1010000000445384