免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
1 [报告]
发表于 2010-05-13 17:14 |显示全部楼层
上源码

论坛徽章:
0
2 [报告]
发表于 2010-05-13 18:00 |显示全部楼层
这代码肯定完蛋~~

论坛徽章:
0
3 [报告]
发表于 2010-05-13 18:25 |显示全部楼层
问题在这里:split //, $_;
100M文件该有多少字符啊。。。。

论坛徽章:
0
4 [报告]
发表于 2010-05-13 18:30 |显示全部楼层
这个什么写法效率应该都差不多了。
将文件的每个字符都存到一个数组,这个数组的下标该有多大。。。。耗光内存很正常的。

论坛徽章:
0
5 [报告]
发表于 2010-05-13 18:46 |显示全部楼层
乘10估计都比较保守。。

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

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

论坛徽章:
0
7 [报告]
发表于 2010-05-14 12:33 |显示全部楼层
我觉得这个东西用C处理会好很多。。。。

论坛徽章:
0
8 [报告]
发表于 2010-05-14 13:06 |显示全部楼层
{:3_188:}哈哈   我们都入了误区了。为何一定要一个字符一个字符读入呢?
就PERL的处理机制而言,这样每读入一个字符,就肯定要占用大于一个字符的存储空间。

不过要实现楼主的需求,可以用另外一个方法。

代码入下,楼主可以试试效率哈~

  1. $/='';

  2. $a=<>;
  3. $b = substr($a,131783200,1);
  4. print $b;
复制代码

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


    {:3_195:} 真的试过么? 那就上源码和真实数据数据说明下。


就算需要检索的数据比较多,难道你原来的方法就不用做检索了么?做那么多变量的检索,肯定没SUBSTR快,因为SUBSTR处理的数据也是在内存的。。。。

论坛徽章:
0
10 [报告]
发表于 2010-05-14 14:16 |显示全部楼层
本帖最后由 toniz 于 2010-05-14 14:21 编辑

说了PERL的数据机制和C的不一样。

下面的代码是可以试试:
  1. my @array = qw(a b c d) ;
  2. print \@array ."\n";
  3. print \$array[0] ."\n";
  4. print \$array[1] ."\n";
  5. print \$array[2] ."\n";
  6. print \$array[3] ."\n";
复制代码
ARRAY(0x9d146f0)
SCALAR(0x9d13c2
SCALAR(0x9d13dd
SCALAR(0x9d146c0)
SCALAR(0x9d13b44)

这里可以发现得到的地址是离散的。而C的数组地址是放一起的。
所以在PERL里面想做这种处理,就不应该去用数组。用数据的话perl维护数组地址会占用太多的空间。所以这里应该考虑perl的STRING。因为string的话,每个字符的地址也是一起的。

至于检验文件大,难道放数组里面就可以不用这个校验环节了么?这个不可能吧。就算是下标,基本检索是必要的。

这里说的是perl的处理,如果你说用数据库,那就不必说了。加载字符到数据库也要不少时间吧。

如果用PERL ,那麻烦楼组测试一下效率哈。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP