【问题标题】:Perl script strange behavior / Reclaim memoryPerl 脚本奇怪的行为 / 回收内存
【发布时间】:2013-12-06 10:42:31
【问题描述】:

我的脚本执行以下操作

  1. 读取一个巨大的文本文件并从中创建一个哈希。(大约 2400 万个简单的键值对。大约需要 5 分钟,消耗 4Gb 计算机内存的 92%)
  2. 使用来自哈希的信息运行模拟。(大约需要 30 分钟)
  3. 在模拟结束时打印结果(到文件和标准输出)

然后它在最后一个打印语句后等待 10+ 分钟并退出。最后的等待不会每次都发生。在等待top 命令期间显示相同的 92% 内存使用但没有 cpu 使用。为什么有时在完成后会等待?如果我点击 CtrlC,它会立即退出,结果(结果)没有任何变化。我该如何调试这个或者它是预期的行为,因为哈希很大?

编辑

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

【问题讨论】:

  • 你的很多问题都慢可能是由于交换。最后花费的时间可能是由于您的数据结构的破坏。 POSIX::_exit(0) 将绕过清理。
  • 如果我绕过清理,操作系统不会回收内存吗?这是一个好习惯吗?如果我在内存更大的系统上运行它,这个问题会消失吗?
  • 操作系统将回收内存。这不是一个好习惯,因为不会调用析构函数。是的,如果这是我猜测的交换问题。
  • 您是否查看过进程在运行时使用了多少交换空间?您可以使用 ps 或 top 执行此操作。您还可以使用 free 监控系统范围的交换使用情况。
  • 有时为了了解正在发生的事情,如果在 Linux 上我执行 ps -ef & 然后 sudo strace -p -s128 它可能(也可能不会)了解它的内容最多。

标签: linux perl hash operating-system swap


【解决方案1】:

我假设你知道“删除”功能(所以删除了对 perldoc -f delete 的引用:)

对于内存调试,您可以使用 valgrind 这个提示也很有帮助:Does Perl v5.10.1 have memory leaks or how to interpret valgrind 它建议使用:

使用 Perl::Destruct::Level 级别 => 1;

【讨论】:

    猜你喜欢
    • 2014-02-06
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2016-03-10
    相关资源
    最近更新 更多