免费注册 查看新帖 |

Chinaunix

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

如何控制perl程序的内存? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-13 17:11 |显示全部楼层 |倒序浏览
读取一个全是字符的100M大小的文件存到一个标量里,然后按空分开存到一个数组里,为什么内存飞涨呢?大概要十几G的内存。
理论上是不需要这么多内存的啊?perl对此到底是如何分配内存的啊?请求高人指点!谢谢!

论坛徽章:
0
2 [报告]
发表于 2010-05-13 17:46 |显示全部楼层
回复 2# toniz


    my $a;
    while (<>){
            chomp;
             $a .= $_;
    }

    my @a = split //, $a;

这就是主要的代码。

论坛徽章:
0
3 [报告]
发表于 2010-05-13 18:08 |显示全部楼层
回复 5# toniz


    为什么呢?除了楼下的方法还有比较高级的写法吗?虚心请教!
   关键我的疑惑是就算存到变量里也不应占用如此大内存啊?这是怎么回事呢?

论坛徽章:
0
4 [报告]
发表于 2010-05-13 19:14 |显示全部楼层
回复 6# DQP


    用了你的方法做了测试,内存减小了一半,但是还是很大,5G左右。
  另外我如果把@a = split //, $a这句话注释掉,内存只占100M左右,说明连接字符并不是太耗内存。
  我觉得这个问题主要是楼上人说的perl的存储不是按照char来存的原因吧。

论坛徽章:
0
5 [报告]
发表于 2010-05-13 19:45 |显示全部楼层
回复 13# ttcn_cu


    这个方法不可行啊,把换行符改成''之后也不是按照一个字符一个字符的读啊

论坛徽章:
0
6 [报告]
发表于 2010-05-13 19:48 |显示全部楼层
回复 10# dugu072_cu


   谢谢啦,受教了。那perl里面在这样的问题上有办法像c一样控制内存吗?

论坛徽章:
0
7 [报告]
发表于 2010-05-14 09:50 |显示全部楼层
回复 19# DQP


    是这样的,我现在有一个字符串文件,比如说是有abcdefghijklmn,另外有一个文件是这样的信息:
   5        e
     7        g
     11      k
    前面一列是位置(从1开始记),后面是字符,我现在想验证这个文件这样的信息有多少是对的,多少是错的。

   我的想法是把前面的字符串存到数组里,用下标做索引,这样速度会很快,如果用substr返回该位置的字符的话可能会慢一些。
   不知有没有其他高效的办法?

   另外前面有位哥们说把换行符换成空,然后再读,我发现这样写不是一个字符一个字符的读,而是直接读到了文件的末尾,好奇怪啊,这是为什么呢?

论坛徽章:
0
8 [报告]
发表于 2010-05-14 12:22 |显示全部楼层
回复 22# DQP


分成块应该是不行的,因为这个方法的思想就是把正确的建一个表,然后查表验证,分块最终还是要把正确的完全添加到表中去的。
查了下书,其实perl里面有好几种方法都可以实现按字符读的。
第一种方法:
$/ = \1,然后读取,这里是把读取的个数控制为1从而实现逐个字符读取。
第二种方法:
read(IN, $text, 1)。这是把读定长字符存到text中去。
第三种方法:
getc(IN),这个函数能实现单字符读取。

这些方法虽然都能实现逐个字符读取,但是所用内存还是没能得到很好的解决,基本上所耗内存都为5G左右(输入文件为60M)。

后来终于找到一个可以控制内存的办法了,但还是比较大,2G左右,但已经有进步了。

我用的办法是vec函数,这个函数能按位存储,vec($_, 0, ,这个能实现把单个字符按照8bit存储。

不知还有高人有其他的好的办法吗?

论坛徽章:
0
9 [报告]
发表于 2010-05-14 12:24 |显示全部楼层
回复 23# guap514


呵呵,这个怎么实现我明白,我们现在讨论的是怎么将内存降下来而且不降低速度。

论坛徽章:
0
10 [报告]
发表于 2010-05-14 13:29 |显示全部楼层
回复 31# toniz


这个方法我之前想到过,问题是如果检测位点比较多的话,substr的速度会远远慢于查表的速度。

当然这个肯定也能解决这个小问题,虽然时间慢点,内存肯定很小。

我现在只是由这个小问题想去研究下perl的存储而已,如何实现低内存的建表,或者说如何使数组的内存所耗不要过大。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP