免费注册 查看新帖 |

Chinaunix

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

perl 读取文件报“OUT OF MEMORY",急!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-24 15:55 |只看该作者 |倒序浏览
用perl写一个EBCDIC码转ASCII的程序(包含中英文),但是主机发来一个100MB左右的文档,无法打开,打开文件的时候提示"OUT OF MEMORY"!!,用程序去读的话也没有反应,测试程序如下:
#!/usr/bin/perl
$filename="\temp\dfK00Abc";
if (open (file,"$filename"))
{print "open successful\n";}

else
{print "open error\n";}

$tmpfile=<file>;

while($tmpfile)
{       print "print strat";
         print "$tmpfile";
}

在while里面print“print strat”也无法显示出来,提示“out of memory”,请专家指点一二,还有就是perll能使用最大内存是多少??谢谢!!

论坛徽章:
0
2 [报告]
发表于 2009-09-24 16:02 |只看该作者

回复 #1 hairboy168 的帖子

for larg scale file, please do not use read whole file content into memory at once.
instead:
  $tmpfile=<F>;
using:
while(<F>) {
    # processing lines
}

论坛徽章:
0
3 [报告]
发表于 2009-09-24 16:34 |只看该作者
楼上的高手,能否告诉一下:
instead:
  $tmpfile=<F>;
using:
while(<F>) {
    # processing lines
}
有什么区别?

while(<F>) {
    # processing lines
}

能够用以下的代码代替:
while(defined ($tmpfile=<F>) ){
    # processing lines
}
谢谢!!

论坛徽章:
0
4 [报告]
发表于 2009-09-24 16:39 |只看该作者

回复 #3 hairboy168 的帖子

$tmpfile=<F>; 把文件'第一行'都读到内存,并且赋值.
while(<F>) { 一行一行的处理

[ 本帖最后由 Perl_Er 于 2009-9-24 20:30 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-09-24 16:58 |只看该作者
那也就是说下面这种方式也是不可以的了??
while(defined ($tmpfile=<F>) ){
    # processing lines
}

假如while(<File>){
那我怎么去控制一行一行的数据,例如:之前可以计算一行的长度$num=length($tmp);,
那现在如何给File定一个变量?
$num=length(???);

请明示,谢谢!!

论坛徽章:
0
6 [报告]
发表于 2009-09-24 17:05 |只看该作者
你那个是死循环啊
只把第一行读出来了 然后反复处理这一行

论坛徽章:
0
7 [报告]
发表于 2009-09-24 18:24 |只看该作者
6楼正解!可以my @tmpfile=<file>;这样每个数组元素就是一行的内容,也可以处理!

论坛徽章:
0
8 [报告]
发表于 2009-09-24 20:24 |只看该作者
……
据我所知,
$tmpfile=<file>; 这种形式,一次只会读一行吧~
@tmpfile=<file>; 这种的,才会一次读出所有到数组~

所以lz第一种形式就出现了 out of memory的话,唯一我能想到的解释就是,这不是个文本文件,所以一次读了所有了!这样的话,用 read / sysread吧!

论坛徽章:
0
9 [报告]
发表于 2009-09-24 20:32 |只看该作者
原帖由 DQP 于 2009-9-24 17:05 发表
你那个是死循环啊
只把第一行读出来了 然后反复处理这一行


while(defined ($tmpfile=<F>) ){
    # processing lines
}
这是个常见<>使用形式吧,如果是文本文件的话,每次<>操作 $. 会增一,到最后 EOF 返回 undef,因此这完全是个可正常运行的循环吧~

论坛徽章:
0
10 [报告]
发表于 2009-09-24 20:36 |只看该作者
while (defined($line = <FH>) ) {
对,perl cookbook上面有这样的例子.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP