免费注册 查看新帖 |

Chinaunix

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

[原创]perl在编辑巨大文件时的应用 [复制链接]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
11 [报告]
发表于 2006-07-26 09:08 |只看该作者
原帖由 waker 于 2006-7-26 08:35 发表
to woodie兄:
[code]# perl -i -ne 'print if $. > 10' file1|lsof -a -c perl -d0-9
COMMAND   PID USER   FD   TYPE DEVICE    SIZE    NODE NAME
perl    16279 root    0u   CHR  136,3               ...

惭愧惭愧,真没注意到,谢谢指出!
仔细看看,两个的inode的确不同,前面的文件后面还有(deleted)字样。再研究研究...

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
12 [报告]
发表于 2006-07-26 09:09 |只看该作者
当时我也纳闷,难道可以预见写指针在读指针之前?

perl不懂的说
瞎写的,懂perl的不要骂我:perl -i bla bla s/$/fffffffffffffffffffffffffffffffffffffffffffffff/ file

如果像这样的插入,该不成程序会自动监测读和写指针的位置,如果写指针要超过读指针就在缓冲区等待?但是如何防止缓冲数据无节制的增长呢?

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
13 [报告]
发表于 2006-07-26 09:13 |只看该作者
原帖由 r2007 于 2006-7-25 23:27 发表
勉强来个命令组合的
  1. off=$(($(head -10 file|wc -c)+0))
  2. n=$(dd if=file of=file ibs=1 skip=$off conv=notrunc 2>&1)
  3. :|dd of=file obs=${n%%+*} seek=1
复制代码

btw:火兄慢走[img]http://bbs ...

用fd是不是就不用算了

  1. exec 3<file
  2. head -10 <&3
  3. dd of=file conv=notrunc <&3
  4. :|dd >&3
  5. exec 3<&-
复制代码

没那么多空间测试

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
14 [报告]
发表于 2006-07-26 09:20 |只看该作者
原帖由 waker 于 2006-7-26 09:13 发表

用fd是不是就不用算了

  1. exec 3<file
  2. head -10 <&3
  3. dd of=file conv=notrunc <&3
  4. :|dd >&3
  5. exec 3<&-
复制代码

没那么多空间测试

妙啊,当初很想利用这些关键位置,苦思不得其解,没想到新开一个fd就迎刃而解了
赞一个

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
15 [报告]
发表于 2006-07-26 09:38 |只看该作者
刚才搞了个loop分区测试了一下,在文件大于分区容量的50%后不久,虽然能够执行完毕,但perl -i开始丢失数据,可见它仍然需要足够的磁盘空间。看来perl -i还是有问题,不好意思误导了!

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
16 [报告]
发表于 2006-07-26 09:50 |只看该作者
to waker:

dd >&3
为啥能在那个位置截断呢?没参透。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
17 [报告]
发表于 2006-07-26 10:06 |只看该作者
FD3不是一直记录着指针么?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
18 [报告]
发表于 2006-07-26 10:11 |只看该作者
只要
: >&3
就可以了,我想问题的关键是:这里用的是>&3, 即以写的方式操作了fd3。
写成下面这样就更容易理解了:
  1. exec 3<file
  2. head -10 <&3
  3. dd of=file conv=notrunc <&3
  4. : >&3
  5. exec 3>&-
复制代码

注意最后两行是大于号

PS: 妙!小弟真是抛砖引玉了,引出二位精妙的讨论,太棒了!

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
19 [报告]
发表于 2006-07-26 10:17 |只看该作者
是的
: >&3已经完成了对文件的操作

exec 3<&-与exec 3>&-都无所谓吧?它只是释放FD表项而已

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
20 [报告]
发表于 2006-07-26 10:21 |只看该作者
关于perl-i是我搞错了,摘一段perl的文档:

  1. ...
  2. -i[extension]

  3.     specifies that files processed by the <> construct are to be edited in-place. It does this by renaming the input file, opening the output file by the original name, and selecting that output file as the default for print() statements.
  4. ...
复制代码

不求甚解的毛病害人呐!对不起大家了。
看来perl -i只能用在空间充足的场合,虽然它的性能还是不错的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP