免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2010-05-14 10:37 |只看该作者
回复 20# glauke


这样啊。  可以分成块做。 每次只读一定数量的字符(比如1M)然后对这块进行验证。
如果这是一个独立的需求 拿C写算了。 多不了几行。。

论坛徽章:
0
22 [报告]
发表于 2010-05-14 10:42 |只看该作者
另外前面有位哥们说把换行符换成空,然后再读,我发现这样写不是一个字符一个字符的读,而是直接读到了文件的末尾,好奇怪啊,这是为什么呢?

当$/为undef或空的话就会把整个文件当作一行

论坛徽章:
0
23 [报告]
发表于 2010-05-14 11:01 |只看该作者
回复 20# glauke
  1. {
  2.     my @arr = ();
  3.     @arr[5,7,11] = qw(e g k);
  4.     sub getNextWord{
  5.         shift @arr;
  6.     }
  7. }
  8. while(<DATA>){
  9.     chomp;
  10.     my @words = split '', $_;
  11.     foreach my $word1(@words){
  12.         my $word2 = getNextWord();
  13.         print "$word1 $word2\n" if $word2 ne "";
  14.     }
  15. }
  16. __DATA__
  17. 0abcdefghijklmn
复制代码
这样可以么

论坛徽章:
0
24 [报告]
发表于 2010-05-14 11:06 |只看该作者
回复 10# dugu072_cu


    了解了!

论坛徽章:
0
25 [报告]
发表于 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
26 [报告]
发表于 2010-05-14 12:24 |只看该作者
回复 23# guap514


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

论坛徽章:
0
27 [报告]
发表于 2010-05-14 12:31 |只看该作者
楼主的难点在于这里:“100M的文件”  这个字符会很多很多。。。。
PERL的数组在内存存储的时候,不是连续内存的。
所以每个字符都去保存一个位置,那样就会消耗很多内存。

而这个需求可以看成为:如何快速获取文件中某个位置的字符。

论坛徽章:
0
28 [报告]
发表于 2010-05-14 12:31 |只看该作者
但是所用内存还是没能得到很好的解决,基本上所耗内存都为5G左右(输入文件为60M)。

怎么可能会用到那么多的内存嘛  除非一直没有释放

论坛徽章:
0
29 [报告]
发表于 2010-05-14 12:33 |只看该作者
我觉得这个东西用C处理会好很多。。。。

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
30 [报告]
发表于 2010-05-14 12:49 |只看该作者
回复  DQP


    是这样的,我现在有一个字符串文件,比如说是有abcdefghijklmn,另外有一个文件是这样 ...
glauke 发表于 2010-05-14 09:50
  1. perl -e '$|=1;%table=('5'=>'e','7'=>'g','11'=>'k');$/=\1;while(<>){if (defined($table{$.}) and $table{$.} ne $_ ){warn "should be $table{$.}, got $_"};}' bigfile.tmp
  2. should be e, got x at -e line 1, <> chunk 5.
  3. should be g, got x at -e line 1, <> chunk 7.
  4. should be k, got x at -e line 1, <> chunk 11.
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP