免费注册 查看新帖 |

Chinaunix

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

关于Perl中hash 使用内存大小的求助。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-19 16:57 |只看该作者 |倒序浏览
最近在使用Perl开发脚本,目前是把数据一次性都从文件中读出来放到Hash中,再传给定义的子过程。

有一次因为数据量较大发生了Out of memory,因为我使用的小型机内存还是16G的,而且并没有启动其他的软件,而我们实际读取的数据并不大,大约也就是2G左右。我觉得不可理解,所以对Hash大小的占用进行了测试。
结果也另我“惊讶”,读取9M的数据,在操作系统的pmap中进程的内存会增长到60M左右。而且,当我减少hash中Value存放的字符串长度(减少了一半)时,也不能减少脚本的内存使用。

所以,我假设,hash在分配内存的时候是按某一个负载因子分配了较大的初始空间,也就是存放小数据量的时候内存会有大量的浪费。

我的求助:是否有XDJM,对于hash的数据结构或者机制比较了解,发些材料看看,或者哪位同学熟知hash对于内存的大小的消耗,也可以交流一下。这个地方实在是比较怪异。

当然从设计上可以避免这样的问题,希望系统设计的高手就不要回复了,单纯了是hash的技术交流贴撒~~

论坛徽章:
0
2 [报告]
发表于 2012-11-19 17:01 |只看该作者
很想知道你是怎么 “ 一次性都从文件中读出来放到Hash中 ” 的

论坛徽章:
0
3 [报告]
发表于 2012-11-19 17:06 |只看该作者
wsxedcer 发表于 2012-11-19 17:01
很想知道你是怎么 “ 一次性都从文件中读出来放到Hash中 ” 的

文件是一行一行读出来的,一次性是说有多个文件但是没有分批处理,仅此而已。这个不是重点。

论坛徽章:
0
4 [报告]
发表于 2012-11-19 17:08 |只看该作者
为什么不把代码贴出来了,便于分析

论坛徽章:
0
5 [报告]
发表于 2012-11-19 17:18 |只看该作者
aku1 发表于 2012-11-19 17:08
为什么不把代码贴出来了,便于分析

公司里面比较长的内容贴不出来,呵呵,测试的脚本就这么几行,没有什么特殊的,同样也会有情况。其中注释掉那行和下面一行赋值,对内存大小的影响不大。
while(<FD>)
{
    @Array=split('\|', $_);
    $key=sprintf "%s%05d", $Array[0], $i,
    #$Hash{$key}="$Array[1]$Array[2]$Array[3]$Array[4]";
    $Hash{$key}="$Array[1]";
}

论坛徽章:
0
6 [报告]
发表于 2012-11-19 17:42 |只看该作者
有点怪   

论坛徽章:
0
7 [报告]
发表于 2012-11-19 17:44 |只看该作者
看看类似ulimit 的参数

论坛徽章:
0
8 [报告]
发表于 2012-11-19 17:45 |只看该作者
呼叫版主 @zhlong8

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
9 [报告]
发表于 2012-11-19 20:57 |只看该作者
大文件不要用split,不相信拿个5G以上的文件试试看。你会知道 regex比他快的多

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
10 [报告]
发表于 2012-11-19 21:19 |只看该作者
hash 本身浪费不了多少无非就是槽多点,即使用 C 写也是必须的。浪费内存的主要还是字符串,32位系统下一个空字符串也要 36 字节,所以字符串越短效率越低,这个无解。

Devel::Size 可以查看数据实际占用的内存,你自己给出的数据不也能估计出文件和内存比 1:5 ~ 1:10
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP