免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 17959 | 回复: 58
打印 上一主题 下一主题

特殊格式的大文本文件处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-05 00:09 |只看该作者 |倒序浏览
有一个大文本文件log,格式如下:
IP:1.1.1.1
DNS:2.2.2.2
PAGE:http://a.com/q?pl=xxx
{
........
不同内容,行数不定,各个记录互不相同
........
}
IP:1.1.1.1
DNS:2.2.2.2
PAGE:http://ab.com/q?pl=xxx
{
........
不同内容,行数不定,各个记录互不相同
........
}
对此,我们称从IP到}截止为一个记录,该文件有多个这样的记录组成(可能达到百万级),其中xxx为数字。
现在需要将所有形如PAGE:http://a.com/q?pl=XXX且xxx出现重复(2次或者多次)的记录提取出来(例如,PAGE:http://a.com/q?pl=123这样的记录出现了2次,则将这两条记录提取出来)。如何高效的完成?

琢磨了一天也没有得到结果,将自己的做的描述一下,当作抛砖。
grep 'PAGE:http://a.com/q?pl=' log>tmp#此步得到所有形如PAGE:http://a.com/q?pl=xxx的url
uniq -D tmp>tmp2#此步得到所有xxx出现重复的url(大概有2K个左右)
设置$/="}",然后一个记录一个记录的去匹配出现重复的url。但是这样实在是太慢了,每个url要扫描整个文件,2K个就要扫描2K次。。。。

求助各位大虾,如何高效的完成该工作?谢谢啦!

[ 本帖最后由 lifeistrue 于 2009-2-5 01:36 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-02-05 00:32 |只看该作者
估算了下, 一条记录50字节, 百万级别的记录, 此文件可能高达50G?

你都得到了重复的url的话, 就算一个一个匹配用琢磨一天的时间应该运行完了吧(一条估个很坏情况10秒不得了了, 2K也就5个小时), 脚本就是这样用的嘛:>

PS: 在大文件中去除那些非重复的url, 但是估计在几十K个...
分段读入内存处理不知道会不会好点.

要不然就用C写, 也不复杂的.

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
3 [报告]
发表于 2009-02-05 01:07 |只看该作者

回复 #1 lifeistrue 的帖子

用PAGE:http:......做hash的键。
新读入的记录,即键不存在的记录可能需要先保存起来。

[ 本帖最后由 ynchnluiti 于 2009-2-5 01:42 编辑 ]

论坛徽章:
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
4 [报告]
发表于 2009-02-05 09:49 |只看该作者

回复 #1 lifeistrue 的帖子

也可以把 log 导到数据库中,然后查询。

记得以前就有人这么搞过。

论坛徽章:
1
未羊
日期:2014-09-08 22:47:27
5 [报告]
发表于 2009-02-05 09:56 |只看该作者
  1. open FH,"<","log.txt" or die "Cannot open the file: log.txt\n";

  2. # 把形如 PAGE:[url]http://ab.com/q?pl=xxx[/url] 的行,作为散列 %url 的键
  3. while (<FH>) {
  4.         if (m!(PAGE:http://[a-zA-Z]+\.com/q\?pl=\d{3})!) {
  5.                 if (exists $url{$1}) {
  6.                         $url{$1}->{'time'} = 2;
  7.                 }else{
  8.                         $url{$1}->{'time'} = 0;
  9.                 }
  10.         }
  11. }
  12. close FH;

  13. # 剔除不重复的键
  14. while (($key,$value) = each %url) {
  15.         delete $url{$key} unless ${$value}{'time'};
  16.         $url{$key}->{'list'} = [];
  17. }

  18. open FH,"<","log.txt" or die "Cannot open the file: log.txt\n";

  19. $/ = '}';

  20. # 把重复的记录加进散列
  21. while (<FH>) {
  22.         if (m!(PAGE:http://[a-zA-Z]+\.com/q\?pl=\d{3})!) {
  23.                 if (exists $url{$1}) {
  24.                         push @{$url{$1}->{'list'}},$_;
  25.                 }
  26.         }
  27. }
  28. close FH;

  29. # 好了,现在重复的记录都在数组 @{$url{$key}->{'list'}} 中了,你爱怎么处理就怎么处理了
复制代码



我这个方法的优点是扫描文件2次(我的能力到此为止了),缺点是散列 %url 刚开始时会非常大。

[ 本帖最后由 wxlfh 于 2009-2-5 13:08 编辑 ]

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
6 [报告]
发表于 2009-02-05 09:56 |只看该作者
原帖由 MMMIX 于 2009-2-5 09:49 发表
也可以把 log 导到数据库中,然后查询。

记得以前就有人这么搞过。

嗯。这样方法也不错

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
7 [报告]
发表于 2009-02-05 10:00 |只看该作者
原帖由 wxlfh 于 2009-2-5 09:56 发表
我这个方法的优点是扫描文件2次(我的能力到此为止了),缺点是散列 %url 刚开始时会非常大。

如果重复的记录不多的话,hash是会很大

论坛徽章:
1
未羊
日期:2014-09-08 22:47:27
8 [报告]
发表于 2009-02-05 10:02 |只看该作者
原帖由 ynchnluiti 于 2009-2-5 10:00 发表

如果重复的记录不多的话,hash是会很大

是啊,不知道计算机的虚拟内存吃不吃得消?

论坛徽章:
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
9 [报告]
发表于 2009-02-05 10:08 |只看该作者
原帖由 wxlfh 于 2009-2-5 09:56 发表
我这个方法的优点是扫描文件2次(我的能力到此为止了),缺点是散列 %url 刚开始时会非常大。

扫描文件两次应该是缺点,咋还成优点了?优点应该是比起直接保存记录,这种先找重复记录的方法消耗内存较少,但缺点是需要扫描文件两次。

论坛徽章:
1
未羊
日期:2014-09-08 22:47:27
10 [报告]
发表于 2009-02-05 10:10 |只看该作者
原帖由 MMMIX 于 2009-2-5 10:08 发表

扫描文件两次应该是缺点,咋还成优点了?优点应该是比起直接保存记录,这种先找重复记录的方法消耗内存较少,但缺点是需要扫描文件两次。

我的意思是比起楼主扫描文件n次,我少一点。汗......
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP