2016-09-09 7 views
0

Ich muss kontinuierlichen Block der variablen Größe 16 ... 128 MB zu einer Datei ohne Gefahr setzen, Dateistruktur in inkonsistentem Zustand (im Falle eines Stromausfalls oder Prozess Tod) zu verlassen.Wie schreibt man 128 MB atomar in eine Datei?

Durch den konsistenten Zustand der Datei meine ich die Garantie, dass die alten Daten verfügbar sind und jeder Speicherplatz, der von fehlgeschlagenen Schreibvorgängen verbraucht wird, wiederverwendet werden kann. Mit anderen Worten, jedes Teil der Datei muss zu irgendeinem Zeitpunkt zwischen den Kategorien "gute Daten" und "Müll" unterschieden werden können, ungeachtet irgendwelcher Software-Schreibfehler (wir gehen davon aus, dass die Platteneinheit in Ordnung ist).

Welche einfachste Datenstruktur in der Datei und welchen Algorithmus könnte man anbieten?

In Verbindung stehende Frage: wie ein DBMS (diejenigen, die auf Dateisystem (MySQL InnoDB, MongoDB, Redis usw.) arbeiten, nicht jene oben auf roher HDD (Oracle)), die mit den ähnlichen Problemen beschäftigen?

+4

Dies ist abhängig vom Betriebssystem und/oder der zugrunde liegenden Dateisystem: und Sie können eine Antwort am Ende mit, die einfach ist „Sie können nicht“, oder „es ist nicht einfach“ – inetknght

+7

Schreiben Sie es auf eine temporäre Datei und benennen Sie es an das Ende, um die vorherige Datei zu überschreiben. –

+1

Alle [Journaling-Dateisysteme] (https://en.wikipedia.org/wiki/Journaling_file_system) haben diese Funktion eingebaut. Sie müssen nichts tun, wenn Sie ein Journaling-Dateisystem verwenden. – IInspectable

Antwort

1

Es gibt ein paar verschiedene Ansätze, je nachdem, ob Sie überschreiben oder anhängen müssen.

Überschreibung

Wenn Sie überschreiben möchten, tun wie in den Kommentaren vorgeschlagen. Schreiben Sie Ihren Inhalt in eine temporäre Datei und kopieren Sie dann die temporäre Datei über das Original. Wenn die temporäre Datei zu Beginn des Schreibvorgangs vorhanden ist, wissen Sie, dass etwas schief gegangen ist, und Sie sollten es löschen. Wenn nicht, können Sie normal fortfahren.

Appending

Dies ist schwieriger. Was Sie vor dem Schreiben tun können, ist das Anhängen einer Zeichenfolge an die Datei, die in Ihrem Inhalt nicht angezeigt wird. Alles, was nach dieser Zeichenfolge ist, wird als "verdächtig" angesehen, bis die Zeichenfolge gelöscht wird (was am Ende des Schreibvorgangs erfolgt). Wenn Sie mit dem Schreiben und Erkennen der Zeichenfolge in Ihrer Datei beginnen, können Sie sie und alle nachfolgenden Elemente als verdächtig löschen. Wenn Sie darauf nicht stoßen, können Sie es und Ihren Inhalt wie gewohnt schreiben.

+1

Das ist eine wahnsinnig naive Art, über Atomizität nachzudenken. Was passiert, wenn die Schutzzeichenfolge nach dem Stromausfall geschrieben wird? Es gibt keine Möglichkeit zu sagen, welcher Teil der Datei gültige Inhalte enthält. Nein, das wird einfach nicht so funktionieren. Ebenso ist die Kopiermethode aus dem gleichen Grund defekt. – IInspectable

1

Dies wird abhängig sein. Aber im Allgemeinen müssen Sie unbuffered IO verwenden, um an das Ende der Datei zu schreiben. Sobald dies erfolgreich ist, aktualisieren Sie eine Art von Kopfzeileninformationen, die anzeigen, dass der neue Datensatz abgeschlossen ist. Sie könnten das mit einem temporären Dateiaustausch kombinieren, um zusätzliche Zuverlässigkeit zu erzielen.

Verwandte Themen