2010-12-04 13 views
2

Der Titel könnte wahrscheinlich besser, aber trotzdem gesetzt worden sein. Ich habe mich gefragt, ob es irgendwelche Funktionen zum Schreiben in Dateien gibt, die den Eigenschaften der ACID für Datenbanken ähneln. Grund ist, würde ich gerne sicherstellen, dass die Datei schreibt, ich werde Doin nicht durcheinander bringen und die Datei beschädigt, wenn der Strom ausgeht.Alle Schreib-Funktionen in Python, die die gleiche Sicherheit haben wie ACID in Datenbanken

+2

Welche Art von Datei ist das? Könnten Sie eine SQLite-Datenbank verwenden, die auf Festplatte serialisiert ist? –

+0

Bitte erläutern. Welche Art von Dateien schreibst du und wie willst du genau das Python-Skript? –

+0

mögliche Duplikate von [Atomic state storage in Python?] (Http://stackoverflow.com/questions/4220803/atomic-state-storage-in-python) –

Antwort

3

Je nachdem, was genau sind Sie mit Ihren Dateien zu tun und die Plattform gibt es ein paar Optionen:

  • Wenn Sie einen Blob aus dem Speicher auf der Festplatte sind die Serialisierung wiederholt Zustand zu halten (Beispiel: dhcp Leases-Datei), Wenn Sie auf einem Posix-System sind, können Sie Ihre Daten in eine temporäre Datei schreiben und die temporäre Datei in Ihr Ziel umbenennen. Auf Posix-konformen Systemen ist dies garantiert eine atomare Operation, sollte es nicht einmal wichtig sein, ob das Dateisystem aufgezeichnet ist oder nicht. Wenn Sie sich auf einem Windows-System befinden, gibt es eine native Funktion namens MoveFileTransacted, die Sie möglicherweise über Bindungen verwenden können. Aber das Schlüsselkonzept hier ist, schützt die temporäre Datei Ihre Daten, wenn das System neu startet der schlimmste Fall ist, dass Ihre Datei die letzte gute Aktualisierung der Daten enthält. Diese Option erfordert, dass Sie die gesamte Datei jedes Mal ausschreiben, wenn eine Änderung aufgezeichnet werden soll. Im Fall der dhcp.leases-Datei ist dies kein großer Leistungseinbruch, größere Dateien könnten sich als umständlicher erweisen.

  • Wenn Sie ständig Daten lesen und schreiben, ist sqlite3 der richtige Weg - es unterstützt atomare Commits für Gruppen von Abfragen und verfügt über ein eigenes internes Journal.Eine Sache, aufpassen denn hier ist, dass Atom Commits zum Kopf langsamer fällig wird die Datenbank von Sperren, wartet auf die Daten zu spülen usw.

Ein paar andere Dinge zu beachten - wenn Ihr Dateisystem Ist async angehängt, erscheinen die Schreibvorgänge als abgeschlossen, da write() zurückkehrt, aber noch nicht auf die Festplatte geschrieben wurde. Rename schützt Sie in diesem Fall, sqlite3 auch.

Wenn Ihr Dateisystem async angehängt ist, können Sie möglicherweise Daten schreiben und verschieben, bevor die Daten geschrieben werden. Wenn Sie also auf einem Unix-System arbeiten, ist es am sichersten, die Synchronisierung zu starten. Das ist auf dem Niveau von 'Leute könnten sterben, wenn dies scheitert' Paranoia obwohl. Aber wenn es ein eingebettetes System ist und es stirbt 'Ich könnte meinen Job verlieren, wenn dies fehlschlägt' ist auch eine gute Rationalisierung für den zusätzlichen Schutz.

1

Die ZODB ist eine ACID-konforme Datenbank-Speicher geschrieben in (meist) Python, in gewisser Hinsicht ist die Antwort ja. Aber ich kann mir vorstellen, dass dies ein wenig übertrieben ist :)

Entweder muss das Betriebssystem dies für Sie bereitstellen, oder Sie müssen Ihre eigene ACID-Konformität implementieren. Zum Beispiel, indem Sie "Datensätze" in der Datei definieren, die Sie schreiben und beim Öffnen/Lesen überprüfen, welche Datensätze geschrieben wurden (was bedeuten kann, dass Sie einige nicht vollständig geschriebene Daten wegwerfen müssen). ZODB zum Beispiel implementiert dies durch Beenden eines Datensatzes durch Schreiben der Größe des Datensatzes selbst; Wenn Sie diese Größe lesen können und es übereinstimmt, wissen Sie, dass der Datensatz vollständig geschrieben wurde.

Und natürlich müssen Sie immer anfügen Datensätze und nicht die gesamte Datei neu schreiben.

1

Ihr Hauptziel ist es, die Integrität der geschriebenen Dateien im Falle von Stromausfällen und Systemabstürzen sicherzustellen. Es gibt ein paar Dinge zu beachten:

  • Stellen Sie sicher, dass Ihre Daten auf die Festplatte geschrieben werden, wenn Sie eine Datei schließen. Selbst wenn Sie es schließen, befinden sich einige der Daten möglicherweise mehrere Sekunden im Betriebssystem-Cache und warten darauf, auf die Festplatte geschrieben zu werden. Sie können das Schreiben mit f.flush(), gefolgt von os.fsync (f.fileno()) auf die Festplatte erzwingen.
  • Ändern Sie keine vorhandenen Daten, bevor Sie sicher sind, dass die aktualisierten Daten sicher auf der Festplatte gespeichert sind. Dieser Teil kann ziemlich schwierig sein (und OS/Dateisystem abhängig).
  • Verwenden Sie ein Dateiformat, mit dem Sie die Integrität von Daten überprüfen können (z. B. Prüfsummen verwenden).

Eine weitere Alternative ist die Verwendung von sqlite3.

EDIT: In Bezug auf meinen zweiten Punkt, empfehle ich diese Präsentation: http://www.flamingspork.com/talks/2007/06/eat_my_data.odp. Dies umfasst auch Probleme mit der "atomaren Umbenennung".