This is documentation for Mathematica 4, which was
based on an earlier version of the Wolfram Language.
View current documentation (Version 11.1)

 Documentation /  Mathematica /  Das Mathematica Buch /  Die Prinzipien von Mathematica /  Globale Aspekte von Mathematica-Sessionen /

Datums- und Zeit-FunktionenFortgeschrittenes Thema: Globale Systeminformation

2.13.4 Speicherverwaltung

Ermittlung der Speichernutzung

Insbesondere für symbolische Berechnungen ist Speicher die primäre Ressource, die den Umfang möglicher Berechnungen begrenzt. Läuft eine Berechnung langsam, so kann man sie möglicherweise länger laufen lassen. Wenn aber die Berechnung Zwischen-Ausdrücke erzeugt, die einfach nicht in den Speicher Ihres Computersystems passen können, dann kann die Berechnung nicht weitergeführt werden.

Mathematica setzt Speicher sehr sorgsam ein. Jedesmal, wenn ein Zwischen-Ausdruck nicht länger benötigt wird, fordert Mathematica den dafür bereitgestellten Platz sofort zurück. Deshalb speichert Mathematica nur jene Ausdrücke, die wirklich benötigt werden; es bewahrt keine nicht benötigten Objekte auf, für die später eine Speicherbereinigung durchgeführt werden müßte.

Dies ergibt die Anzahl Bytes im Speicher, die gerade von Mathematica benutzt werden.

In[1]:= MemoryInUse[ ]

Out[1]=

Dies erzeugt eine Liste mit 10000 Elementen.

In[2]:= Range[10000] // Short

Out[2]=

Für die Liste wird zusätzlicher Speicher benötigt.

In[3]:= MemoryInUse[ ]

Out[3]=

Diese Liste wird aufbewahrt, da sie der Wert von Out[2] ist. Wenn Sie Out[2] löschen, wird die Liste nicht mehr benötigt.

In[4]:= Unprotect[Out]; Out[2]=.

Die Größe des eingesetzten Speichers verringert sich wieder.

In[5]:= MemoryInUse[ ]

Out[5]=

Dies zeigt die maximale Größe des Speichers, die zu irgendeinem Zeitpunkt während der Session benötigt wurde.

In[6]:= MaxMemoryUsed[ ]

Out[6]=

Häufig stellt sich die Frage nach der genauen Größe des Speichers, die Mathematica tatsächlich auf dem betreffenden Computersystem nutzen kann. Normalerweise gibt es eine bestimmte Speichergröße, die für alle Prozesse zur Verfügung steht, die zu einem bestimmten Zeitpunkt auf dem Computer laufen. Mitunter ist diese Größe gleich der physischen Anzahl der Bytes im RAM. Häufig ist darin auch ein gewisser Anteil „virtuellen Speichers" enthalten, der sich durch Verlagern der Daten von und auf einen Massenspeicher ergibt.

Wenn Mathematica läuft, benötigt es Platz sowohl für Daten als auch für Code. Der vollständige Code von Mathematica hat in der Regel eine Größe von mehreren MegaBytes. Für jede einzelne Berechnung wird gewöhnlich nur ein kleiner Teil dieses Codes eingesetzt. Bei dem Versuch, die Gesamtgröße des Ihnen zur Verfügung stehenden Platzes für Mathematica-Daten zu bestimmen, sollten Sie nicht den für Mathematica-Code benötigten Platz vergessen. Außerdem müssen Sie den Platz berücksichtigen, der von anderen auf dem Computer laufenden Prozessen belegt ist. Wenn es weniger laufende Jobs gibt, werden Sie bemerken, daß Ihr Job dann gewöhnlich mehr Speicher einsetzen kann.

Es ist auch nützlich zu wissen, daß die für eine Berechnung benötigte Zeit sehr stark davon abhängen kann, wieviel physikalischer Speicher Ihnen zur Verfügung steht. Obwohl Sie mit virtuellem Speicher im Prinzip große Speicherbereiche nutzen können, ist der Zugriff auf diesen jedoch gewöhnlich hundert- oder sogar tausendmal langsamer als der auf physikalischen Speicher. Wenn also Ihre Berechnung so groß wird, daß sie virtuellen Speicher einsetzen muß, dann kann es sein, daß sie sehr viel langsamer laufen wird.

Speichereingeschränkte Berechnung

MemoryConstrained funktioniert ähnlich wie TimeConstrained. Wird mehr als die angegebene Speichergröße angefordert, versucht MemoryConstrained, Ihre Berechnung abzubrechen. Ehe die Berechnung abgebrochen wird, kann es, ähnlich wie bei TimeConstrained, zu einer gewissen Überziehung bei der Größe des tatsächlich genutzten Speichers kommen.

Ermittlung der Größe von Ausdrücken

ByteCount mag durchaus für sehr nützlich gehalten werden, wenn es um die Abschätzung der gerade noch handhabbaren Größe eines Ausdrucks einer bestimmten Art geht. Man sollte sich jedoch bewußt machen, daß die von ByteCount gelieferten Ergebnisse von einer Mathematica-Version zur anderen sehr unterschiedlich ausfallen können.

Ein anderer wichtiger Punkt ist, daß ByteCount immer den maximalen Speicherplatzbedarf für einen bestimmten Ausdruck angeben wird. Häufig wird Mathematica jedoch für den Ausdruck sehr viel weniger Speicherplatz belegen. Die Hauptfrage in diesem Zusammenhang ist, wieviele der Unterausdrücke im Ausdruck gemeinsam genutzt werden können.

In einem Ausdruck wie f[1 + x, 1 + x] sind die zwei Unterausdrücke 1 + x identisch, aber sie werden nicht zwangsläufig im selben Speicherplatz des Rechners abgelegt. ByteCount liefert Ihnen die Anzahl Bytes, die zur Speicherung von Ausdrücken benötigt wird, dies unter der Annahme, daß keine Unterausdrücke gemeinsam genutzt werden. Sie sollten sich bewußt machen, daß die gemeinsame Nutzung von Unterausdrücken oft aufhört, sobald eine Operation wie zum Beispiel der Operator /. verwendet wird.

Trotzdem können Sie Mathematica mit der Funktion Share explizit anweisen, Unterausdrücke gemeinsam zu nutzen. Auf diese Weise läßt sich der tatsächlich zur Speicherung eines bestimmten Ausdrucks benötigte Platz beträchtlich reduzieren.

Optimieren der Speichernutzung

Bei den meisten Computersystemen ist der Speicherplatz, der von einem laufenden Programm benutzt wird, in zwei Bereiche geteilt: den Speicher, der explizit vom Programm belegt wird und den „Stapelbereich" (oder Stack). Bei jedem Aufruf einer internen Routine durch das Programm wird ein gewisser Teil des Stapelbereichs zur Ablage der zum Aufruf gehörenden Parameter verwendet. Bei vielen Computersystemen muß die maximale Größe des Stapelbereichs, der von einem Programm benutzt werden kann, im voraus angegeben werden. Wird die angegebene Größe überschritten, so endet das Programm üblicherweise.

Einer der Hauptverwendungen des Stapelbereichs in Mathematica ist die Verwaltung des Aufrufs einer Mathematica-Funktion durch eine andere. Alle derartigen Aufrufe werden explizit im Mathematica-Stack verzeichnet (siehe Abschnitt 2.5.11). Der Umfang dieses Stapels läßt sich mit Hilfe des globalen Parameters $RecursionLimit kontrollieren. Man sollte darauf achten, daß dieser Parameter klein genug gewählt wird, so daß Ihnen der verfügbare Stapelbereich auf dem Computersystem nicht ausgeht.

Datums- und Zeit-FunktionenFortgeschrittenes Thema: Globale Systeminformation