Perl的哈希使用一种称为bucket-chaining的技术。所有具有相同散列的密钥(请参阅中的宏)进入同一个“桶”,一个线性列表。
按照perldata文档
如果你评估在标量上下文的哈希,它如果哈希为空,则返回错误。如果有任何键/值对,则返回true;更准确地说,返回的值是一个字符串,由使用的存储段数和分配的存储段数组成,并由斜杠分隔。只有找出Perl的内部哈希算法在数据集上执行效果不佳,这才非常有用。例如,你在一个散列中粘贴了10,000个东西,但在标量上下文中评估%HASH
显示"1/16"
,这意味着只有十六个桶中有一个被触摸过,并且大概包含了所有项目的10,000个。这不应该发生。如果在标量上下文中评估绑定哈希,将导致严重错误,因为此桶使用信息目前不适用于绑定哈希。
要查看您的数据集是否具有病理分布,您可以检查标量上下文中的各个级别,例如。,
print scalar(%$this), "\n",
scalar(%{ $this->{date} }), "\n",
scalar(%{ $this->{date}{"school 1"} }), "\n",
...
对于有些过时概述,请参阅How Hashes Really Work在perl.com。
学生姓名,四级关键字长度的适度减少不会产生重大影响。一般来说,perl实现对于抛出问题存在强烈的偏见。这不是你父亲的FORTRAN。
是XML文件,以及有多少内存被使用多大的程序? – Ether 2010-08-04 00:43:13
是的,即使使用较短的字符串,也会有很多开销。 – ysth 2010-08-04 00:53:07
我有20个xml文件,每个文件都是0.25GB,通过将学生名称字符串从26Byte减少到10个字节,每个xml文件的大小现在变为0.185GB。它使用〜2GB内存为64位perl,并且在我缩短字符串长度后仍然使用〜2GB内存,每个学生的格式如下: ' mary123456 –
user399517
2010-08-04 01:04:25