• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > 如何高效地做到大文本去除重复行

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

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了专注于心 高效于行,高效的时刻行共享汽车,如何做到高效课堂,真正做到了高效和,如何做到高效执行等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:如何高效地做到大文本去除重复行
描述:

主要是对行去重
如果先排序的话。。大约是这样:

sort bigtext.txt|uniq

因为uniq只能去相邻行的重,但是对大文本进行排序这个代价有点大?O(n log n)对于n达到上亿好像太慢了?
其他的使用set更加。。。如果重复率小,吃内存吃的不行。。。


解决方案1:

我提供一个思路供您参考。
扫一遍文件,对每一行计算一个MD5或者SHA-1值,在内存构建trie树。鉴于数据量很大,生成的MD5值应该存在许多前缀,所以采用trie可以节省空间(如果想进一步节省空间,可以采用三向单词查找树,比trie分支更少),而且trie树的深度不会超过MD5值的长度,几十而已,每次查找或者插入MD5值都是个时间复杂度为常数的操作。向trie添加某个MD5值时如果发现该值已经存在,则抛弃目前扫描的行;如果不存在,则把MD5值插入trie树,把当前扫描行写入结果文件(这个文件保存所有不重复的行)。
这样,扫描一遍文件就能实现去重。

解决方案2:

如果可以忍受误差(就是有一定的误判),bloom filter是个不错的办法。

解决方案3:

有时候超大文本你的内存受不了,所以比较好的方法是找几个分割点,把所有数据分成N堆,各自排序后组合。(貌似得编码……)

解决方案4:

但是对大文本进行排序这个代价有点大?O(n log n)对于n达到上亿好像太慢了?

代价不大。排序的话是省内存的。(sort的算法实现应该是比较高效的。)

要不就是对每行算SHA-1,这样只要比较SHA-1就可以。

解决方案5:

P.S. 哈希表实现对内存有要求,基本上1000w去重后的数据对应1G内存的样子。我都用64G的机器搞,所以还好。。如果再大,上hadoop吧。

如果只是去重,用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亿么,可想而知


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2017-06-07 是否可能支持大目录的Bucket间迁移?
  • 2017-06-07 Windows7下sublimetext3运行python3无法print/input
  • 2017-06-07 关于CDN的疑问
  • 2017-06-07 正则匹配bbb,但是aaabbb就不要(里面的bbb也不要)
  • 2017-06-07 laravel怎么验证blob文件是图片?
  • 2017-06-07 正则表达式匹配错误
  • 2017-06-07 pageofficefornet如何保留Word的修改痕迹以及如何给Word末尾的下一页写内容
  • 2017-06-07 七牛C-sdk有个问题
  • 2017-06-07 (python)pandasdataframe怎么删除所有值都相同的一列?
  • 2017-06-07 简单的文本编辑器保存不了颜色和字体

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • (python)目前百度云盘个人用户还有能用的API吗
    • launchctlMac下的launchctl定时任务不执行
    • 一道简单的ACM递归题?
    • JavaScript怎么在实现的匿名函数的参数中传入数据?
    • 视频稳定技术用到了哪些算法?
    • pythonrefindall匹配结果不完整
    • 升级了Java到18之后,IDEA里面找不到18的JDK
    • dict元组参数无法创建字典
    • (python)django中引用包的问题
    • OpenKM-41_JBoss-423GA

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有