我应该使用哪个工具来查找Perl中的内存分配?

时间:2010-06-09 14:28:36

标签: perl memory-leaks memory-management

我使用File :: Slurp在一个大文件中啜饮但是根据文件的大小,我可以看到我必须在内存中使用它两次,或者可能因为变成16位unicode而膨胀。我怎样才能最好地诊断Perl中的那种问题?

我输入的文件大小为800mb,我的perl进程正在分析该数据在运行时分配的大约1.6gb。

我意识到我对这个问题的理由可能是错的,但我不确定证明/反驳我的理论的最有效方法。

  

更新

     

我从嫌疑人名单中删除了狡猾的字符编码。看起来我在某个时候正在复制变量,我只是无法弄清楚在哪里。

更新2:

我现在已经做了一些调查,发现它实际上只是从File :: Slurp获取导致问题的数据。我查看了文档并发现我可以让它返回一个scalar_ref,即

my $data = read_file($file, binmode => ':raw', scalar_ref => 1);

然后我没有得到记忆的膨胀。在我的情况下获取数据时,这是有道理的并且是最合理的事情。

关于查看存在哪些变量等的信息通常有帮助,但谢谢。

2 个答案:

答案 0 :(得分:4)

也许Devel::DumpSizes和/或Devel::Size可以提供帮助吗?我认为前者在你的情况下会更有用。

  

Devel :: DumpSizes - 转储脚本中给定点可用的变量的名称和大小(以递增顺序)。

     

Devel :: Size - 用于查找Perl变量的内存使用情况的Perl扩展

答案 1 :(得分:4)

以下是Perl中有关内存问题的一些常规资源:

就您自己的建议而言,最简单的反驳方法是编写一个简单的Perl程序:

  1. 创建一个大(100M)纯文本文件,可能只需将循环中的相同字符串输出到文件中,或者通过dd调用<{1}}命令运行system()命令的二进制文件/ p>

  2. 使用标准Perl open()/@a=<>;

  3. 读取文件
  4. 测量内存消耗。

  5. 然后对您的800M文件重复#2-#3。

    这会告诉你问题是File :: Slurp,程序中的一些奇怪的逻辑,还是文件中的某些特定内容(例如非ascii,虽然如果最终成为原因我会感到惊讶)