免费注册 查看新帖 |

Chinaunix

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

如何快速取得超大文件(1G以上)最后一行的行号 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-08 16:30 |只看该作者 |倒序浏览
如何快速取得超大文件(1G以上)最后一行的行号,就是整个文件的行数,使用wc命令或用open遍历文件,感觉速度慢啊.......

论坛徽章:
0
2 [报告]
发表于 2011-09-08 16:31 |只看该作者
没办法的
除非你自己在这个所谓的超大文件头部加点信息进去

论坛徽章:
0
3 [报告]
发表于 2011-09-08 16:46 |只看该作者
本帖最后由 Perlvim 于 2011-09-08 17:17 编辑

读取大文件,遍历文件句柄,要用 while , 不能用 foreach.
while 每次只读一行的内容到内存,读完就释放掉了,foreach 则要把整个文件都读进来。
很耗用内存。
  1. use strict;
  2. use warnings;
  3. use 5.010;
  4. use autodie;

  5. open(my $fh, '<', 'one_G_file');
  6. $. = 0;
  7. while (<$fh>) {
  8.     print $. if eof;
  9. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2011-09-08 16:57 |只看该作者
你看到得是一行,但其实它只是/r ,/n 或者  /r/n  ,所以遍历还是必须的。{:3_195:}

论坛徽章:
0
5 [报告]
发表于 2011-09-08 17:56 |只看该作者
maybe you can sysread a chunk of text and search for "\n", that can help reduce the latency of I/O read which is the slowest thing for this task.

论坛徽章:
0
6 [报告]
发表于 2011-09-08 18:04 |只看该作者
听说 sysread 比 read 读文件更快,标准 I/O 最慢。但 sysread & read 每次读取固定字节的数据,无法判断换行符的位置。匹配 & 累加,似乎更增加了额外计算量。希望有心人有空测试一下。

论坛徽章:
0
7 [报告]
发表于 2011-09-08 18:13 |只看该作者
after the chunk of text is read, use s/// or tr to count the "\n", then you have the total of line number. At least it will work with ascii text file. It is trickier if the file is not ascii encoded, I would guess.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2011-09-08 19:39 |只看该作者
如果 wc 做的好的话,应该就没有比 wc 更快的方法了

论坛徽章:
0
9 [报告]
发表于 2011-09-08 21:34 |只看该作者
用File::Slurp模块 比open快

论坛徽章:
0
10 [报告]
发表于 2011-09-08 22:22 |只看该作者
1G的文件用 Slurp ,太夸张了,除非是4G的内存
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP