如何高效地做到大文本去除重复行

如果只是去重,用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值