免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
41 [报告]
发表于 2010-05-14 14:03 |只看该作者
本帖最后由 glauke 于 2010-05-14 14:08 编辑

回复 38# guap514

我已经做了不下二十次的测试了,所用的输入文件大小为60M,所用内存是5G。

代码如下:

  1. my @a;
  2. $/ = \1;
  3. while (<IN>){
  4.          next if (/\n/);
  5.          push @a, $_;
  6. }
复制代码
你可以自己找个文件测试一下,的确是这样的。

我也很郁闷,为什么perl管理内存这方面这么差呢

论坛徽章:
0
42 [报告]
发表于 2010-05-14 14:09 |只看该作者
回复 34# glauke


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


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

论坛徽章:
0
43 [报告]
发表于 2010-05-14 14:13 |只看该作者
回复 40# DQP


把校验文件分块?可以是可以,但是怎么保证校验文件分的块和原文件分的块一一对应呢,除非进行排序。但是问题是排序之后还是有pos和charl两个信息,

如果建数组存的话,只能开一个和原文件一样大小的数组,其中pos的下标元素是char。但这样并没有减少内存啊。

论坛徽章:
0
44 [报告]
发表于 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 ,那麻烦楼组测试一下效率哈。。。

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


    按pos的范围分块好了
比如1 到 5 * 1024 * 1024分到一个文件

论坛徽章:
0
46 [报告]
发表于 2010-05-14 14:24 |只看该作者
如果建数组存的话,只能开一个和原文件一样大小的数组,其中pos的下标元素是char。但这样并没有减少内存啊。


:s是我没说清楚
这样的数组([pos, char], [pos, char] ......)
对应到你的那个例子就是这样的: ([5, 'e'], [7, 'g'], [11, 'k'])

论坛徽章:
0
47 [报告]
发表于 2010-05-14 14:39 |只看该作者
回复 44# toniz


嗯,我同意你的看法。的确是perl的数组存储不连续,导致它还要存储更多的信息。

可是perl开一个有60m个元素每个元素为char型的数组居然要那么大的空间,还是很出乎我的意料之外的。

我一向对perl都是比较偏爱的,这让我有点沮丧。

perl里可用string吗?没用过啊,怎么用啊?请教!最好有代码。

论坛徽章:
0
48 [报告]
发表于 2010-05-14 14:40 |只看该作者
本帖最后由 DQP 于 2010-05-14 14:44 编辑

话说校验文件一般都不大 不过是抽几个而已.
把原文件都存到内存本来就是比较怪的 想法. 存个校验文件就好了
-----
超过6000分

论坛徽章:
0
49 [报告]
发表于 2010-05-14 14:51 |只看该作者
回复 48# DQP

呵呵, 恭喜恭喜!

估计存数组的数组的话内存还是不小,哎!不想做测试了,perl的内存管理是有点差啊,心情比较沮丧!

不过不管怎样,还是谢谢大家的热心帮助和支持!

论坛徽章:
0
50 [报告]
发表于 2010-05-14 15:00 |只看该作者
本帖最后由 guap514 于 2010-05-14 15:04 编辑
回复  DQP

呵呵, 恭喜恭喜!

估计存数组的数组的话内存还是不小,哎!不想做测试了,perl的内存管理 ...
glauke 发表于 2010-05-14 14:51



    如果60M的  读到内存变成 600M  我还有可能会相信
变成 5G  打死我也不信  1k的数据 要用100k的空间  怎么可能
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP