WICHTIGE AKTUALISIERUNG
Ich habe gerade herausgefunden, dass nach dem Neustart von Matlab und dem Computer dieser vereinfachte Code das Problem für mich auch nicht mehr reproduziert ... Es tut mir so leid, dass ich Ihre Zeit mit einem Skript aufgebraucht habe, das nicht funktioniert hat. Das alte Problem besteht jedoch immer noch in meinem ursprünglichen Skript, wenn ich etwas in irgendeinem Ordner (den ich ausprobiert habe) in der inneren "for" -Schleife abspeichere. Für meine Zwecke habe ich mich darum gekümmert, einfach nicht sparen, es sei denn, ich brauche es unbedingt. Das ursprüngliche Skript hat die folgende Struktur in Bezug auf for
Schleifen und die Verwendung von save
oder load
:
Wenn das Skript vollständig ausgeführt wird, speichert es ca. 10 GB und lädt ca. 2 GB Daten.
Das gesamte Skript ist ziemlich langwierig und macht viele Speicher- und Ladevorgänge. Es wäre auch ziemlich unpraktisch, alle hier zu teilen, bevor ich es geschafft habe, das Problem leider in einer reduzierten Version zu reproduzieren. Als ich frustrierend entdeckte, dass der gleiche Code sich von Zeit zu Zeit anders verhalten konnte, wurde es sofort mühsamer als erwartet, eine Vereinfachung zu finden, die das Verhalten konsistent reproduziert. Ich werde zurückkommen, sobald ich mir einen überschaubaren Code sicher bin, der das Problem verursacht.
VORHERIGE PROBLEMBESCHREIBUNG (NB. Der untenstehende Code reproduziert das beschriebene Problem nicht mit Sicherheit.):
Ich habe gerade gelernt, dass Sie in Matlab keinen Speicherordner für temp in einer for
-Schleife festlegen können, ohne das Laden von Daten in der nächsten Runde der Schleife zu verlangsamen. Meine Frage ist warum?
Wenn Sie daran interessiert sind, das Problem selbst zu reproduzieren, lesen Sie bitte den nachfolgenden Code. Um es auszuführen, benötigen Sie außerdem eine Datei namens anyData.mat zum Laden und zwei Ordner zum Speichern, einen temp und den anderen temporary .
%Vor% Sie werden auf der Y-Achse des Diagramms sehen, dass das Laden von Daten wesentlich länger dauert, wenn Sie in der späteren for
-Schleife auf temporär und nicht auf temporär speichern. Gibt es jemanden da draußen, der weiß, warum das passiert?
Es gibt zwei Dinge hier
Wenn Sie Bildverarbeitungsoperationen ausführen und mehrere Bilder haben, können Sie aufgrund der Geschwindigkeit, des Cache und des aktuellen Speichers, die für MATLAB verfügbar sind, einen Engpass beim Schreiben auf die Festplatte bekommen.
Ich kann das Problem nicht reproduzieren, vermute, dass es system- und datengrößenspezifisch ist. Aber einige allgemeine Kommentare, die Ihnen aus der misslichen Lage helfen könnten:
Wie von Kommentatoren und den obigen Antworten gezeigt, kann Datei-E / A innerhalb einer doppelten for-Schleife extrem parasitär sein, besonders in Fällen, in denen Sie nur auf einen Teil der Daten in der Datei zugreifen müssen, wo andere Systemoperationen die Verzögerung verzögern Prozess, oder wo die Datendateien groß genug sind, um virtuellen Speicher (Windows) / Auslagerungsspeicher (Linux) zu benötigen, um sie sogar zu laden. Im letzteren Fall könnten Sie in einer Situation sein, in der Sie eine Datei von einem Teil der Festplatte auf einen anderen verschieben, wenn Sie sie öffnen!
Ich nehme an, dass Sie laden / speichern, weil Sie nicht über 10 GB RAM verfügen, um alles im Speicher für die Berechnung zu halten. Das eigentliche Problem ist nicht beschrieben, also kann ich nicht sicher sein, aber ich denke, Sie könnten feststellen, dass die matfile
-Klasse nützlich ist ... TMW-Dokumentation . Dies wird verwendet, um direkt zu einer Matte-Datei zu mappen. Dies:
reduziert den Dateistrom beim Öffnen und Schließen von IOPS
erlaubt beliebig große Variablengrößen (abhängig von der Plattengröße, nicht vom Speicher)
ermöglicht es Ihnen, teilweise zu lesen / schreiben (d. h. nur einige Elemente eines Arrays zu schreiben, ohne die gesamte Datei zu laden)
Wenn Ihre mat-Datei zu groß ist, um im Speicher gehalten zu werden, wird vermieden, dass sie in den Swap-Bereich geladen wird, was sehr mühsam wäre.
Hoffe, das hilft.
Tom