免费注册 查看新帖 |

Chinaunix

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

Tie::File处理大文件问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-07-02 10:16 |只看该作者 |倒序浏览
本帖最后由 linewer 于 2016-07-02 10:17 编辑

近3T的大文件(大概2195822197行),每行一条记录, 想查找符合某条件的行,
在一台Intel(R) Xeon(R) CPU E5-2609 v3 1.90GHz , 64GB内存的服务器上,跑了大半天,最后直接内存溢出了;  最后测试了下grep直接查找,大半天最后出来结果了....
如下程序有啥问题么,或者对于这么大文件用perl处理有啥建议么
  1. #!/usr/bin/env perl
  2. use Tie::File;

  3. open( $fn, '>', './line-number.log') or die "Could not open file";
  4. open( $fm, '>', './tie-result.log') or die "Could not open file";
  5. tie @array, 'Tie::File', './myresult.json' or die "File error\n";
  6. $min=1464537601000-900;
  7. $max=1466783999000;
  8. for ($n=2195822197;$n>=0;$n--)   #只知道大概在文件中下部的样子,具体不知道哪一行,采用从后往前查找匹配
  9. {
  10.   my $tmp=$array[$n];
  11.   if( $tmp =~ /"Time":"(.*?)",.*"time":"2016-0[5-6].*?","SerialNumber":"123456790abcd"/)
  12.   {
  13.     if ( $1 >= $min  && $1 <= $max)
  14.     {
  15.        print $fn "$n\n";
  16.        print $fm "$tmp\n";
  17.     }
  18.     if( $1 < $min)
  19.     {
  20.        last;
  21.     }
  22.   }
  23. }

  24. close($fn);
  25. close($fm);
复制代码

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
2 [报告]
发表于 2016-07-02 12:49 |只看该作者
这么大的文件用 Tie:: 模块,这个模块会把文件尽可能的装到内存里。既然是遍历,就用文件句柄,逐行遍历就好了。

不过这么大的文件不放在数据库里,一行一行的找太费时间。不如一次放在数据库里,省的下次麻烦。

或者用多线程语言,把文件分成多个部分,分别去找,会快很多。

论坛徽章:
0
3 [报告]
发表于 2016-07-02 15:32 |只看该作者
回复 2# 104359176
本来是DB里,因为临时整改调整,以前知道Tie并简单用过,这次想试试处理这么大文件是什么效率,结果大失所望...


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP