0

我在这里遵循了最佳答案,请参阅下面的代码以获取在我的 perl 代码中的给定行使用的系统内存。我正在运行 Windows 7 Home Basic,64 位,4 GB 内存,4.06 GB 虚拟内存(在我的电脑下的高级系统设置中指定)。在 perl Out of Memory之前,我在一行中收到了 perl 的以下消息。

内存使用量:1916346368

假设这个数字以字节为单位(= 1.78 GB),为什么 perl 会出现内存不足?如何获取所有进程的系统总内存使用量?

计算内存的代码块如下。我正在使用草莓 Perl 5.12.3.0

use Win32::OLE qw/in/;

sub memory_usage() {
    my $objWMI = Win32::OLE->GetObject('winmgmts:\\\\.\\root\\cimv2');
    my $processes = $objWMI->ExecQuery("select * from Win32_Process where ProcessId=$$");

    foreach my $proc (in($processes)) {
        return $proc->{WorkingSetSize};
    }
}

print 'Memory usage: ', memory_usage(), "\n";

Perl -V 提供以下信息 http://pastebin.com/mvF7YgKH

更新:这个问题用 64 位 perl 解决了。但我也注意到该程序在 Ubuntu 上运行 32 位 perl 时没有任何障碍。因此,Windows 上的 Strawberry perl 可能比 Ubuntu 上的 perl 占用更多内存。

4

2 回答 2

3

如果您试图分配或重新分配一个巨大的字符串、数组或散列,它可能会请求比系统可用的更大的内存块。虽然您有 4 gigs 的实际内存和 4 gigs 的虚拟内存,但其他进程可能已经消耗了其中的很大一部分。

或者,您的系统可能有一个每个进程的内存限制,可能是 2 gig。

最后,您的操作系统可能是 64 位的,但您的 Perl 可能是 32 位的。在这种情况下,它可以处理的最大内存量为 2 gig。如果您在某个地方发布我们可以查看的副本,perl -V我们也许可以解决这个问题。

于 2012-11-03T19:47:41.883 回答
0

你有 32 位 Perl。Windows 不能为 32 位进程分配超过 2GB 或内存也就不足为奇了。如果您安装 64 位 Perl,这应该在物理 RAM 上达到最大值。

于 2012-11-03T22:24:36.427 回答