Perl中使用的计算系统内存

Perl中使用的计算系统内存,perl,memory,windows-7,virtual-memory,strawberry-perl,Perl,Memory,Windows 7,Virtual Memory,Strawberry Perl,我按照上面的答案在perl代码的给定行中获取正在使用的系统内存。我正在运行Windows 7 Home Basic、64位、4 GB ram、4.06 GB虚拟内存(如“我的电脑”下的“高级系统设置”中所述)。在perl内存不足之前,我在一行中收到了来自perl的以下消息 内存使用率:1916346368 假设这个数字是以字节(=1.78 GB)为单位的,为什么perl会耗尽内存?如何获取所有进程的系统总内存使用率 计算内存的代码块如下所示。我使用的是草莓Perl 5.12.3.0 use Wi

我按照上面的答案在perl代码的给定行中获取正在使用的系统内存。我正在运行Windows 7 Home Basic、64位、4 GB ram、4.06 GB虚拟内存(如“我的电脑”下的“高级系统设置”中所述)。在perl内存不足之前,我在一行中收到了来自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提供了以下信息


更新:使用64位perl解决了这个问题。但我也注意到该程序在Ubuntu上的32位perl上运行w/o hitch。因此,Windows上的perl可能比Ubuntu上的perl占用更多内存。

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

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


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

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

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



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

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

您有32位Perl。Windows不能为32位进程分配超过2GB的内存也就不足为奇了。如果您安装64位Perl,物理RAM的最大容量应为。

当Perl内存不足时,它在做什么?@Schwern它正在将一个文件读入几个3D散列。@user13107,我们需要查看内存不足的源代码的相关部分。@titanofold,我将在几个小时后回来。谢谢。更新:这个问题用64位perl解决了。但我也注意到该程序在Ubuntu上的32位perl上运行w/o hitch。因此,Windows上的草莓perl可能比Ubuntu上的perl占用更多内存。perl在内存不足时做了什么?@Schwern它正在将一个文件读入一些3D散列。@user13107,我们需要查看内存不足的源代码的相关部分。@titanofold,我将在几个小时后回来。谢谢。更新:这个问题用64位perl解决了。但我也注意到该程序在Ubuntu上的32位perl上运行w/o hitch。因此,Windows上的perl可能比Ubuntu上的perl占用更多内存。请参阅这里的
perl-V
输出更新问题。在perl运行时,我没有运行任何其他繁重的进程。浏览器、文本编辑器等都已关闭。@user13107,看起来像32位版本的Perl。答案可能是您可能没有安装64位版本,或者您需要将问题分解为更小的部分。@titanofold是的,现在安装草莓perl 64位(不卸载perl 32位)。它会给已经安装的perl模块带来问题吗?我必须重新安装从cpan安装的所有附加模块吗?谢谢。@user13107是的,您必须重新安装模块。如果它们不是纯Perl程序,则可能被编译为32位库或程序。@titanofold遗憾的是,64位Perl没有帮助。程序仍在内存使用量为191620308时退出(与以前大致相同)。我可能会错过什么?我使用了一个不同的perl可执行文件,它出现在
C:\strawberry64\perl\bin
中。请参见
perl-V
的输出,这里也更新了这个问题。在perl运行时,我没有运行任何其他繁重的进程。浏览器、文本编辑器等都已关闭。@user13107,看起来像32位版本的Perl。答案可能是您可能没有安装64位版本,或者您需要将问题分解为更小的部分。@titanofold是的,现在安装草莓perl 64位(不卸载perl 32位)。它会给已经安装的perl模块带来问题吗?我必须重新安装从cpan安装的所有附加模块吗?谢谢。@user13107是的,您必须重新安装模块。如果它们不是纯Perl程序,则可能被编译为32位库或程序。@titanofold遗憾的是,64位Perl没有帮助。程序仍在内存使用量为191620308时退出(与以前大致相同)。我可能会错过什么?我使用了一个不同的perl可执行文件,它出现在
C:\strawberry64\perl\bin