免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: gongyonghui2
打印 上一主题 下一主题

大数据去重复,求速度 [复制链接]

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
11 [报告]
发表于 2014-05-22 14:19 |只看该作者
sort -u 不行嘛

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
12 [报告]
发表于 2014-05-22 14:24 |只看该作者
当标准方法不能一步到位时,也可以考虑分而治之。具体如何划分取决于第一列数值的分布,比如以取模(第一列数值 % 10)来划为10个文件,每个文件的去重相互独立独立,最后合并。这个文件大小对于磁盘连续IO是没有压力的,但可以极大缓解内存的不足。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
13 [报告]
发表于 2014-05-22 14:51 |只看该作者
回复 9# gongyonghui2


    照理说,6G内存的机器处理这个数据文件不成问题。你用的是 64-bit 操作系统吧?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
14 [报告]
发表于 2014-05-22 15:02 |只看该作者
本帖最后由 MMMIX 于 2014-05-22 15:03 编辑

回复 12# timespace


    另外一个方法就是直接弄个数据库,把数据导入数据库,再导出就行了。

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
15 [报告]
发表于 2014-05-22 15:28 |只看该作者
本帖最后由 timespace 于 2014-05-22 19:47 编辑

回复 14# MMMIX
惭愧,很久不用perl,理解错需求了。
   

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
16 [报告]
发表于 2014-05-22 21:37 |只看该作者
试试先用perl排序每行的三个数,再sort -u

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
17 [报告]
发表于 2014-05-23 18:18 |只看该作者
这帖子没结果了。。。
好奇之下,下了LZ的数据文件,解压2.5GB,还好电脑内存16GB,按照前面你们的perl代码执行前50M行(总数的1/3),物理内存占用超过6GB,意味着全部数据16GB内存都可能hold不住:
  1. $ head -50000000 tt1.txt | ./reduce.pl
  2.   PID  %CPU %MEM    RSS NSWAP ELAPSED COMM
  3.   479  99.1 40.0 6711876     -   01:34 /usr/bin/perl
复制代码
其实看这个50M,只要内存够,执行时间1分34秒,还能等。

把原文件按照每行排序后的最大数字,模11,分为11个文件,每个文件行数分布比较均匀:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $modulo = 11;
  5. my @files = ();

  6. for (0 .. $modulo-1) {
  7.     open $files[$_], ">", "map_$_.txt"
  8.         or die "could not open map_$_.txt: $!";
  9. }

  10. while (<>) {
  11.     chomp;
  12.     my ($f1, $f2, $f3) = sort {$a <=> $b} split /\t/;
  13.     print {$files[$f3 % $modulo]} "$f1\t$f2\t$f3\n";
  14. }
复制代码
  1. 13282037 13358435 13856488 13894659 13915435 14064033 14125693 14858455 14869804 15549080 16652976
复制代码
最后对每个文件再运行你们的perl代码,生成11个新的文件就是最终结果,wc统计了下,重复行不到1%,印证了开始的想法,16GB内存都搞不定,必须切割小文件处理。

论坛徽章:
1
午马
日期:2013-11-25 16:01:44
18 [报告]
发表于 2014-05-23 19:40 |只看该作者
回复 17# timespace


    非常感谢

论坛徽章:
1
午马
日期:2013-11-25 16:01:44
19 [报告]
发表于 2014-05-23 19:48 |只看该作者
谢谢大家,此贴收尾

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
20 [报告]
发表于 2014-05-23 21:36 |只看该作者
回复 17# timespace


    不科学呀,这内存占用的也太多了点。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP