我使用File :: Slurp在一个大文件中啜饮但是根据文件的大小,我可以看到我必须在内存中使用它两次,或者可能因为变成16位unicode而膨胀。我怎样才能最好地诊断Perl中的那种问题?
我输入的文件大小为800mb,我的perl进程正在分析该数据在运行时分配的大约1.6gb。
我意识到我对这个问题的理由可能是错的,但我不确定证明/反驳我的理论的最有效方法。
更新
我从嫌疑人名单中删除了狡猾的字符编码。看起来我在某个时候正在复制变量,我只是无法弄清楚在哪里。
更新2:
我现在已经做了一些调查,发现它实际上只是从File :: Slurp获取导致问题的数据。我查看了文档并发现我可以让它返回一个scalar_ref,即
my $data = read_file($file, binmode => ':raw', scalar_ref => 1);
然后我没有得到记忆的膨胀。在我的情况下获取数据时,这是有道理的并且是最合理的事情。
关于查看存在哪些变量等的信息通常有帮助,但谢谢。
答案 0 :(得分:4)
也许Devel::DumpSizes
和/或Devel::Size
可以提供帮助吗?我认为前者在你的情况下会更有用。
Devel :: DumpSizes - 转储脚本中给定点可用的变量的名称和大小(以递增顺序)。
Devel :: Size - 用于查找Perl变量的内存使用情况的Perl扩展
答案 1 :(得分:4)
以下是Perl中有关内存问题的一些常规资源:
就您自己的建议而言,最简单的反驳方法是编写一个简单的Perl程序:
创建一个大(100M)纯文本文件,可能只需将循环中的相同字符串输出到文件中,或者通过dd
调用<{1}}命令运行system()
命令的二进制文件/ p>
使用标准Perl open()/@a=<>;
测量内存消耗。
然后对您的800M文件重复#2-#3。
这会告诉你问题是File :: Slurp,程序中的一些奇怪的逻辑,还是文件中的某些特定内容(例如非ascii,虽然如果最终成为原因我会感到惊讶)