Linux Perl脚本异常行为/回收内存

Linux Perl脚本异常行为/回收内存,linux,perl,hash,operating-system,swap,Linux,Perl,Hash,Operating System,Swap,我的脚本执行以下操作 读取一个巨大的文本文件并从中创建一个散列(大约2400万个简单的键值对。大约需要5分钟,并消耗92%的4Gb计算机内存) 使用散列中的信息运行模拟。(大约需要30分钟) 在模拟结束时打印结果(到文件和标准输出) 然后在最后一个print语句后等待10分钟以上,然后退出。最后的等待并非每次都会发生。在等待期间,top命令显示相同的92%内存使用率,但没有cpu使用率。为什么有时在完成后还要等待?如果我点击CtrlC,它会立即退出,结果(结果)没有任何变化。我如何调试它,或者它

我的脚本执行以下操作

  • 读取一个巨大的文本文件并从中创建一个散列(大约2400万个简单的键值对。大约需要5分钟,并消耗92%的4Gb计算机内存)
  • 使用散列中的信息运行模拟。(大约需要30分钟)
  • 在模拟结束时打印结果(到文件和标准输出)
  • 然后在最后一个print语句后等待10分钟以上,然后退出。最后的等待并非每次都会发生。在等待期间,top命令显示相同的92%内存使用率,但没有cpu使用率。为什么有时在完成后还要等待?如果我点击CtrlC,它会立即退出,结果(结果)没有任何变化。我如何调试它,或者它是预期的行为,因为散列是巨大的

    编辑


    是否可以通过从散列中删除不需要的键值对来动态回收一些内存

    我假设您知道“delete”函数(因此删除了对perldoc-f delete的引用:)

    对于内存调试,可以使用valgrind 此外,此提示也很有用: 它建议使用:


    使用Perl::Destruct::Level=>1

    你的很多问题都可能是由于交换造成的。最后花费的时间可能是由于数据结构的破坏<代码>POSIX::_退出(0)将绕过清理。如果我绕过清理,操作系统不会回收内存吗?这是一种好的做法吗?如果我在内存更多的系统上运行它,这个问题会消失吗?操作系统会回收内存。这不是好的做法,因为析构函数不会被调用。是的,如果我猜这是一个交换问题。您是否查看了进程在运行时使用了多少交换空间?您可以使用ps或top来完成此操作。你也可以使用free来监控系统范围内的交换使用情况。有时为了了解发生了什么,如果在Linux上我做了一个ps-ef,那么sudo strace-p-s128,它可能会(也可能不会)给出它在做什么的想法。