2012-04-03 11 views
3

Ich muss einen Speicher-hungrigen Prozess zu simulieren. Auf einem Rechner mit 4,0 GiB benötige ich zum Beispiel einen Prozess, der 3,2 GiB benötigt (gib oder nimm ein paar MiB).Absichtlich essen bestimmte Menge an Speicher mit Perl-Skript

Ich nahm an, es sollte so einfach sein:

my $mbytes = 3276; 
my $huge_string = 'X' x ($mbytes * 1024 * 1024); 

Aber ich am Ende mit Prozess doppelt so viel Speicher zu essen, wie ich es brauche.

  • dies ist das gleiche auf zwei Windows 7 amd64 Maschinen: ein mit 64-Bit, die andere mit 32-Bit-Version von Strawberry Perl

  • Ich Sysinternals Process Explorer und beobachte „Private mit Bytes“

natürlich könnte ich nur $mbytes /= 2 (für jetzt, werde ich wahrscheinlich tun), aber:

  • Gibt es einen besseren Weg?

  • Kann jemand erklären, warum die Menge ist doppelt so lang wie die Zeichenfolge?

Antwort

6

-Code von http://www.perlmonks.org/index.pl?node_id=948181 angepasst, geht alle Kredit BrowserUk Perlmonk.

my $huge_string = 'X'; 
$huge_string x= $mbytes * 1024 * 1024; 

, warum die Menge der Zeichenfolge doppelt so lang ist?

Denken Sie über die Reihenfolge der Auswertung nach. Der Ausdruck auf der rechten Seite weist Speicher für Ihren Ausdruck x zu, und auch dies entspricht der Zuweisungsoperation in Ihrem neuen Skalar. Wie bei Perl üblich, wird der Speicher nicht sofort freigegeben, auch wenn der Ausdruck auf der rechten Seite nicht mehr referenziert wird.

Der Betrieb auf einem vorhandenen Skalar vermeidet die zweite Zuweisung, wie oben gezeigt.

+1

+1. Erleuchtung. Und getestet um zu arbeiten.) –