WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Arbeitsspeicher vom Rechner läuft voll

 

Akosol
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 31.08.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.08.2017, 09:45     Titel: Arbeitsspeicher vom Rechner läuft voll
  Antworten mit Zitat      
Hallo zusammen,

ich habe seit längerem das Problem, dass Matlab immer wieder enorm viel Arbeitsspeicher benötigt.
Dies tritt immer wieder auf, nachdem ich einige Rechnungen durchgeführt habe.

Hier kommt eine genauere Beschreibung vom letzten Vorfall:
Nach Start hat Matlab ca. 500 mb benötigt (das ist soweit normal).
Ich nacheinander Daten aus csv-Dateien importiert (jeweils 8 Spalten und 20 - 50 Zeilen). Aus den Daten habe ich dann den letzten Wert aus einer Spalte rausgelesen und in ein Array geschrieben (x(end+1) = dx(end)). Anschließend habe ich den Rest des workspace wieder gelöscht (clear-Befehl).
Das ganze zwölf mal, sodass ich ein 1x12 double-Array hatte. Zudem hatte ich noch ein weiteres Array gleicher Größe erstellt.
Daraus mit plot() ein Diagramm erzeugt und dieses abgespeichert. Zudem den Workspace in einer .mat-Datei gespeichert. Das ganze ein paar mal wiederholt.
Es waren im ganzen also keine aufwändigen Rechnungen.

Am Ende hat Matlab ca. 5-6 GB Arbeitsspeicher verwendet.
In dem Zustand war ein Plot geöffnet und drei Variablen mit insgesamt 32 Werten im Workspace sichtbar.

Zum System:
Windows 7 mit 8 GB Arbteitsspeicher
Matlab R2016a (Studentenversion)

Kann mir jemand einen Tipp geben, wie ich den Arbeitsspeicher leeren kann, oder, wie ich verhindere, dass der Arbeitsspeicher so voll läuft?
Den pack-Befehl hatte ich irgndwann mal getestet, allerdings ohne Erfolg.
Die Suche im Forum und bei Google zu ähnlichen Problemen war leider auch nicht erfolgreich.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.08.2017, 09:57     Titel:
  Antworten mit Zitat      
Hallo,

passiert dies jedes Mal in ähnlicher Form, wenn du MATLAB neu startest und den Code laufen lässt?
Ein reproduzierbares Beispiel wäre hilfreich.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Akosol
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 31.08.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.08.2017, 11:00     Titel:
  Antworten mit Zitat      
Leider kann ich das nicht mit Sicherheit sagen.
Ich habe mal überprüft, ob der Speicherbedarf relativ kontinuierlich steigt. Das konnte ich leider nicht feststellen. Erste Versuche, das Ergebnis zu reproduzieren sind nicht geglückt.
Je nachdem, wie oft ich rechne, dauert es manchmal eine halbe Stunde, mal auch länger. Festgestellt habe ich das erst immer, als ich festgestellt habe, dass der Rechner mit allem unglaublich langsam wird. (ist ja auch kein Wunder, wenn insgesamt gut 90% des Arbeitsspeichers belegt sind)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.08.2017, 12:12     Titel:
  Antworten mit Zitat      
Hallo,

ist in der Form schwierig was dazu zu sagen. Zwei Überlegungen:
1) Technischen Support kontaktieren
2) Auf neuere Version wechseln und schauen, ob das Problem da auch noch auftritt

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Akosol
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 31.08.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.08.2017, 12:30     Titel:
  Antworten mit Zitat      
Gibt es denn einen Befehl, mit dem ich mein Matlab mehr oder weniger zurücksetzen kann, sodass der Arbeitsspeicher geleert wird?
Das würde mir schonmal reichen. Wenn der Speicher erstmal vollgelaufen ist, dauert es immer einige Minuten, das Programm zu schließen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.08.2017, 12:47     Titel:
  Antworten mit Zitat      
Hallo,

pack kommt da am ehesten hin.
Deiner Beschreibung nach könnte das ein Memory Leak sein. Dann kommt man eben nicht mehr an die Speicheradressen heran.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Akosol
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 31.08.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.09.2017, 21:09     Titel:
  Antworten mit Zitat      
Danke für die Antworten.
Ich werde nochmal ausgiebigere Tests machen, wenn ich wieder mehr Zeit habe.
Als nächstes werde ich wohl erstmal eine andere Version testen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 16.09.2017, 14:59     Titel: Re: Arbeitsspeicher vom Rechner läuft voll
  Antworten mit Zitat      
Hallo Akosol,

Ein wichtiges Detail fehlt in der Beschreibung des Problems: Wie stellst Du denn fest wieviel Arbeitsspeicher Matlab verwendet? Das ist nämlich gar nicht so einfach und jenach verwendetem Tool kan die Information ganz unterschiedlich sein. Wie ist denn "verwenden" überhaupt genau definiert?

Ein einfaches Beispiel:
Code:
x = ones(1, 100);
x = [x, 2];

Zunächst reserviert Matlab ein Array für 100 Elemente, also 800 Bytes. Das Betriebssystem stellt sie zur Verfügung und hat sie bereits mit Nullen beschrieben, damit man dort nicht zufällig andere Daten (z.B. Passwörter) vorfindet. Dann füllt Matlab die Elemente mit Einsen.
In der zweiten Zeile erzeugt Matlab ein neues Array mit 101 Elementen, kopiert die alten Daten, fügt die 2 an und gibt den Speicher für das vorherige Array wieder frei.

Aber was bedeutet genau "freigeben"? Das Betriebssystem kann nun wieder über diesen Speicher verfügen und wird es auch sofort tun, sobald es Zeit dazu findet den Speicher wieder mit Nullen zu füllen. Aber wenn es noch kleine Zeit dazu findet, weil z.B. Matlab gerade arbeitet? Dann kann "liegt" dieser Speicherbereich erst mal ungenutzt "herum".
Vielleicht gibt Matlab den Speicher aber auch gar nicht ans Betriebssystem zurück, sondern wartet Memory Manager wartet erstmal, ob Matlab ihn nicht vielleicht gleich selbst wieder benötigt. Wie Matlab's Memory Manager das genau handhabt, ist nicht offiziell dokumentiert und kann sich zwischen den Versionen, oder aber auch Betriebssystemen unterscheiden. Früher konnte man das Verhalten mit unterschiedlichen Parametern beim Start von Matlab beeinflussen.

Es wäre sinnvolles, wenn das Betriebssystem Matlab so lange reservierten und wieder freigegebenen Speicher lässt, bis ein naderes Programm ihn "dringender" benötigt. Speicherblöcke, die noch benötigt werden, allerdings nicht zum gegenwärtigen Zeitpunkt, kann das OS auch in den virtuellen Speicher auf der Festplatten ablegen und so für "freies RAM" sorgen.
Ähnliches gilt für Teile des RAMs, die das OS für das Zwischenspeichern von File-Ein- und Ausgaben verwendet: Ein File byte-weise zu lesen wäre enorm aufwändig und langsam. Stattdessen liest das OS Files gleich am Block ein, vielleicht in 1024 Byte oder kiloByte Blöcken. Die genaue Größe hängt vom freien Speicher ab, von der Festplatte, der Art der File-Zugriffe und einigen anderen Faktoren. Statt also immer wieder einzelne Bytes zu lesen, wird das File in einem "RAM-Cache" zwischengespeichert. Ob dieser Cache dann im Task-Manager der entsprechenden Applikation oder dem Betriebssystem zugeordnet wird, ist ziemlich willkürlich.

Wie sieht es mit dem Speicher aus, wenn die Grafikkarte Teile des RAMs für das Buffern des OpenGL-Renderers verwendet? Gehört das zu Matlab oder nicht?

Es kann durchaus eine sehr effiziente Strategie sein, das RAM zu 90% "auszulasten", anstatt Zeit mit dem Freigeben von Speicher zu verplempern. Es ist dann nur genau zu definieren, was "auslatsen" bedeutet, denn der Speicher ist ja nicht "verbraucht" oder "voll".

Eine genaue Analyse, wie viel RAM Matlab denn nun tatsächlich "belegt" ist folglich wirklich sehr komplex. Je nach tool sieht das ganz unterschiedlich aus. Der Windows Task Manager, der Resource Monitor, der Garbage Collector und die Memory Manager von Matlab und des Betriebssystems geben da z.T. total unterschiedliche Informationen. Siehe z.B.:
Code:
feature memstats   % Unter Windows

Es sagt z.B. nichts aus, wenn 95% des Speichers frei sind, wenn dies so geschieht, dass jeweils 50 von 1000 Bytes beschrieben sind, der Rest aber frei. Dann findet man immer noch keinen Speicher um ein Array von 1000 Bytes zu allozieren. In diesem Fall wäre der Speicher "fragmentiert" und damit unbenutzbar. Hier würde ein pack helfen.
Speicher-Fragmentierungen treten oft auf, wenn ein Programmier vergisst den benötigten Speicher am Stück zu "pre-allozieren", sondern ein Array iterativ anwachsen lässt:
Code:
x = [];
for k = 1:1e6
  x(k) = k;
end

Hier wird nicht 1e6*8 Bytes (8 MB) reserviert, sondern sum(1:1e6) * 8: 4 TerraByte! Das bremst Matlab bzw. das OS massiv aus, denn es wird enorm viel Zeit mit dem Allozieren, Kopieren und dem Überschreiben mit Nullen vergeudet. Und dabei ist nicht eindeutig definiert, ob dieser Speicher nun wie angezeigt wird: ist er "frei" oder "belegt"? Von Matlab oder dem OS?

Anstatt also nach freiem oder belegtem Speicher ausschau zu halten, ist es sinnvoller den Code nach vergessenen Pre-Allocatins zu durchsuchen. Die Verwendeung von "struct of arrays" anstatt "arrays of structs" ist auch hilfreich: Jede Variable und jedes Feld eines Structs benötigt etwa 100 Byte an zusätzlichen Informationen (Name der Variablen, Dimensionen, usw.). 1000 Variablen mit einem Scalar belegen dann etwa 100 kB mehr als ein Vektor mit 1000 Elementen.

Figures, die sehr viele Elemente enthalten, belegen auch enorm viel Speicher. Wenn man z.B. einen Film anzeigt, indem man jedes neue Bild per image hinzufügt ohne die alten images zu löschen, wird Matlab zunehmend langsamer. Viel effizienter ist es dann, nur ein image zu erzeugen und danach nur noch die CData zu ändern.

Eine genaue Analyse, ob Dein Code überhaupt ein Speicherproblem hat, erfodert also tiefer in das Software-Engineering einzusteigen, eine detailierte Kenntnis der vom Betriebssystem und Matlab's Memory Manager angewendeten Methoden und dann spielen auch noch andere Applikationen, die zur gleichen Zeit laufen, eine Rolle.

Vielel Grüße, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Akosol
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 31.08.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.09.2017, 20:10     Titel:
  Antworten mit Zitat      
Hallo,
Ich konnte inzwischen feststellen, dass das Problem sich sehr einfach reproduzieren lässt, wenn ich Plots erzeuge. Mit jedem erzeugten Plot stieg der Arbeitsspeicherbedarf massiv an. Dieser wurde durch schließen der Plots und löschen der Variablen (clear all) auch nicht geringer, sodass mit jedem weiteren Plot auch der Bedarf stieg.

Inzwsichen bin ich auf Version 2017b umgestiegen. Dort habe ich die Probleme glücklicherweise nicht. Es hat scheinbar an der Version (oder der Installation der Version) gelegen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.