当你删除元素时,Perl中的哈希表是否会缩小?
更具体地说,我继承了一个Perl程序,它会解析一个巨大的文件(1 GB),并加载一个哈希表。它会对另一个文件执行相同的操作,然后比较不同的元素。在此过程中,内存消耗非常大,即使我添加了在使用哈希元素后删除它们,内存消耗似乎也没有受到影响。
该脚本非常缓慢,而且内存占用很高。我知道它设计得不好,但有关哈希表内存使用情况的任何想法吗?
当你删除元素时,Perl中的哈希表是否会缩小?
更具体地说,我继承了一个Perl程序,它会解析一个巨大的文件(1 GB),并加载一个哈希表。它会对另一个文件执行相同的操作,然后比较不同的元素。在此过程中,内存消耗非常大,即使我添加了在使用哈希元素后删除它们,内存消耗似乎也没有受到影响。
该脚本非常缓慢,而且内存占用很高。我知道它设计得不好,但有关哈希表内存使用情况的任何想法吗?
如果第二个文件中的输入只需要读取一次,那么你可能可以将内存使用量减少一半。
根据你的算法,你甚至可以同时保持两个文件句柄和一个小的未使用值哈希表在内存中。例如,合并或比较排序数据 - 您只需要保持每个文件的当前行,并在进行比较时互相比较,跳过直到cmp
改变为止。
另一种方法可能是进行多次传递,特别是如果您的计算机有一个或多个空闲核心。打开读取管道,并使子进程以可管理的预组织块向您提供数据。
对于更通用的算法,您只能通过将其交换为磁盘速度的成本来避免支付内存大小的代价。
在大多数情况下,将每个数据源加载到内存中只在开发时间上获胜 - 然后当N变大时,您将付出其占用空间和/或速度的代价。
解决方法:fork一个子进程来分配所有的内存。让它在完成任务后返回一些汇总信息;当fork出的进程死亡时,它的内存也会随之释放。这可能有点麻烦,但对于某些情况是有效的。一个适用的例子是,如果您正在处理许多文件,每次只处理一个文件,只有少量的大文件需要处理,并且不需要保留太多中间状态。