删除元素时,Perl中的哈希值会缩小吗?
更具体地说,我有一个我继承的perl程序,它会解析一个巨大的文件(1 GB)并加载哈希哈希值.它会对另一个文件执行相同的操作,然后对不同的元素进行比较.在此过程中内存消耗量很大,即使我添加了删除哈希元素,但是使用它们时内存消耗似乎不受影响.
脚本非常慢,这样的内存耗尽.我知道它没有很好的设计,但有关哈希内存使用的任何想法?
你可能想看看像DBM :: Deep这样的东西.它确实提到了迈克尔提到的那些东西,所以你不必考虑它.一切都存储在磁盘而不是内存中.它只是缺少一个更高级的数据库服务器.
此外,如果您想要追踪性能瓶颈,请查看Devel :: NYTProf,这是纽约时报发布的 Perl概要中的新热点.
通常,Perl无法将内存返回给操作系统.但是,它可以在内部重用内存,这可以减少程序所需的内存量.
请参阅perlfaq3:如何释放数组或散列,以便我的程序缩小?
如果哈希使用的内存过多(即>物理内存),则可以将tie
它们放到磁盘上的文件中.这将大大减少您的内存使用量,但要注意访问磁盘上的结构比访问内存中的结构要慢得多.(磁盘颠簸也是如此.)
如果你的哈希真的是巨大的,一个更好的策略是可能使用磁盘上的哈希,并让操作系统担心进出内存.我特别喜欢用于在磁盘上存储大哈希的 Berkeley DB,而Perl BerkeleyDB模块提供了一个功能齐全的界面,包括一个绑定的API.
DBM :: Deep也可以用作插入式哈希替换,但依赖于自己的格式.如果您的结构需要被其他(非Perl)系统读取,这可能会很痛苦.
关于具体问题:不,删除哈希键不会减少程序的内存消耗.
关于更一般的情况:绝大多数程序和语言将继续保留他们以前使用但尚未使用的存储器.这是因为请求操作系统分配内存是一个相对较慢的操作,所以他们保留它以防以后再次需要它.
因此,如果您想要改善这种情况,您需要通过使用磁盘存储来修改您的算法,以便不需要一次访问尽可能多的数据,从而减少程序所需的峰值内存量(例如前面提到的DBM :: Deep),或者通过从不需要的变量释放空间回到perl(让它们超出范围或将它们设置为undef),以便可以重用它.