Frage

Ich habe 2 unabhängige MATLAB -Arbeiter, die zuerst Daten erhalten/speichern und das zweite lesen (und einige Berechnungen usw.).

Er speichert zunächst Daten als .mat-Datei auf der Festplatte, während der zweite vorliest. Es dauert ~ 20 Sekunden bis SAVE Diese Daten als .mat und 8millisec zu DELETE es. Vor dem Speichern von Daten löscht zuerst die alte Datei und speichert dann eine neuere Version.

Wie kann die zweite Überprüfung dieser Daten existieren und is not corrupt? ich kann nutzen exists Das sagt mir jedoch nicht, ob die Daten beschädigt sind oder nicht. Für z. exists Pässt aber LOAD gibt Ihnen einen Fehler, der sagt - Daten korrupt usw.

Vielen Dank.

War es hilfreich?

Lösung

Sie können nicht ohne einen Synchronisierungsmechanismus - bis zum Zeitpunkt der Sekunde die Überprüfung abgeschlossen und die Datei lesen, hat möglicherweise zuerst begonnen, sie erneut zu schreiben. Sie brauchen eine Art Schloss oder Mutex.

Zwei Optionen für Basismatlab.

Wenn sich dies in einem lokalen Dateisystem befindet, können Sie eine separate Sperrdatei neben der Datendatei verwenden, um den gleichzeitigen Zugriff auf die Datendatei zu verwalten. Verwenden Sie Javas NIO FileChannel- und Filelock -Objekte aus MATLAB, um das erste Byte der Sperrdatei zu sperren, und verwenden Sie diese als Semaphor, um den Zugriff auf die Datendatei zu steuern. Daher wartet der Leser, bis der Schriftsteller fertig ist und umgekehrt. (Wenn dies in einem Netzwerkdateisystem liegt, versuchen Sie dies nicht - die Dateisperrung scheint zu funktionieren, wird jedoch normalerweise nicht offiziell unterstützt und ist meiner Erfahrung nach unzuverlässig.)

Oder Sie könnten einfach versuchen/fangen um Ihre load() Rufen Sie an und lassen Sie es ein paar Sekunden innehalten und wiederholen, wenn Sie einen beschädigten Dateifehler erhalten. Das .mat -Dateiformat ist so, dass Sie keine teilweise Lektüre erhalten, wenn der Schriftsteller es noch schreibt. Sie erhalten diesen beschädigten Dateifehler. Sie können dies also als faule Art von Kollisionserkennung und Backoff verwenden. Das mache ich normalerweise.

Um das Streitfenster zu reduzieren, sollten Sie zuerst in eine temporäre Datei im selben Verzeichnis schreiben, und verwenden Sie dann eine Umbenennung, um sie in das endgültige Ziel zu verschieben. Auf diese Weise ist die Datei nur während eines schnellen Dateisystem -Verschiebungsvorgangs und nicht in den 20 Sekunden des Datenschreibens nicht verfügbar. Wenn Sie mehrere Autoren haben, stecken Sie den PID und den Hostnamen in den Namen Temp -Dateinamen, um Kollisionen zu vermeiden.

Andere Tipps

Klingt nach einem klassischen Problem der Ressourcenfreigabe zwischen 2 Threads (RW)

Kurz gesagt, Sie sollten eine Methode der sicheren Kommunikation zwischen den Mitarbeitern finden. Prüfen das raus.

Versuchen Sie auch zu tippen

showDemo ('paralleldemo_communic_prof')

in Matlab

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top