Warum würde das Speichern in einen Ordner namens temp dazu führen, dass das Laden von Daten in einer for-Schleife in Matlab verlangsamt wird?

9

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 :

%Vor%

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?

    
LaWa 15.01.2013, 09:48
quelle

2 Antworten

0

Es gibt zwei Dinge hier

  1. Die Speicherung während einer for-Schleife ist eine teure Operation, da sie normalerweise einen Dateistream öffnet und ihn schließt, bevor er weitergeht. Sie können dies möglicherweise nicht vermeiden.
  2. Das zweite ist die Speichergeschwindigkeit und die Cache-Geschwindigkeit. Höchstwahrscheinlich Programme verwenden Temp-Ordner für seine eigenen temporären Dateien und haben einen Garbage Collector oder Software, die nach diesen, um sie zu bereinigen. Wenn Sie den Dateistrom in diesem Ordner öffnen und schließen, müssen Sie eine Anfrage senden, um exklusiven Schreibzugriff auf den Ordner zu erhalten. Dies fügt wieder die Zeit hinzu.

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.

    
Farrukh Subhani 29.01.2013 05:07
quelle
0

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

    
thclark 06.07.2016 20:30
quelle

Tags und Links