2012-11-03 2 views
0

J'ai suivi la première réponse here, see below for code pour que la mémoire système soit utilisée sur une ligne donnée de mon code perl. Je suis sous Windows 7 Édition Familiale Basique, 64 bits, 4 Go RAM, 4.06 Go de mémoire virtuelle (Comme spécifié sous paramètres système avancés sous mon ordinateur). J'ai reçu le message suivant de perl à une ligne, avant que perl ne passe à Mémoire insuffisante.Mémoire système utilisée en Perl

Utilisation de la mémoire: 1916346368

En supposant que ce nombre est en octets (= 1,78 Go), pourquoi ne perl sortir de la mémoire? Comment puis-je obtenir l'utilisation totale de la mémoire système par tous les processus?

Le bloc de code pour calculer la mémoire est comme ci-dessous. J'utilise Strawberry 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 donne des informations suivantes http://pastebin.com/mvF7YgKH

Mise à jour: Le problème se est résolu avec perl 64 bits. Mais j'ai aussi remarqué que le programme fonctionnait sans accroc sur 32 bits perl sur Ubuntu. Donc, peut-être Strawberry Perl sur Windows prend plus de mémoire que Perl sur Ubuntu.

+0

Que faisait Perl lorsqu'il manquait de mémoire? – Schwern

+0

@Schwern Il lit un fichier dans quelques hachages 3D. – user13107

+0

@ user13107, nous devons voir la partie pertinente du code source qui manque de mémoire. – titanofold

Répondre

3

Si vous essayiez d'allouer ou de réaffecter une énorme chaîne, un tableau ou un hachage, il aurait pu demander un plus grand bloc de mémoire que celui disponible sur le système. Alors que vous avez 4 concerts de mémoire réelle et 4 concerts de virtuel, d'autres processus ont pu en consommer une grande partie. En outre, votre système peut avoir une limite de mémoire par processus pouvant atteindre 2 gigabits par seconde. Enfin, votre système d'exploitation peut être en 64 bits, mais votre Perl peut être de 32 bits. Dans ce cas, la quantité maximale de mémoire qu'il peut gérer serait de 2 concerts. Si vous postez une copie de perl -V quelque part nous pouvons voir, nous pourrions être en mesure de le faire.

+0

Veuillez voir la sortie de 'perl -V' ici http://pastebin.com/mvF7YgKH Mise à jour de la question aussi. Je ne cours pas d'autres processus lourds pendant que Perl est en cours d'exécution. Le navigateur, les éditeurs de texte, etc. sont tous fermés. – user13107

+0

@ user13107, qui ressemble à une version 32 bits de Perl. Cela peut être la réponse en ce sens que vous n'avez peut-être pas installé une version 64 bits, ou vous devez diviser votre problème en plus petits morceaux. – titanofold

+0

@titanofold oui, en installant Strawberry perl 64 bits maintenant (sans désinstaller perl 32 bits). Cela créera-t-il un problème avec les modules Perl déjà installés? Devrai-je réinstaller tous les modules supplémentaires que j'ai installés à partir de cpan? Merci. – user13107

0

Vous avez un Perl 32 bits. Il n'est pas surprenant que Windows ne peut pas allouer plus de 2 Go ou de la mémoire au processus 32 bits. Si vous installez 64 bits Perl, cela devrait atteindre au maximum à la RAM physique.