Wie kann man sich zwischen Speicherformaten entscheiden und welche Anwendungsfälle gibt es für einige?


10

Wir haben verschiedene Möglichkeiten, Programmdaten zu speichern (Dateien in Spielen, Mitarbeiterdatenbanken, Programmkonfiguration usw. speichern):

  • Klartext (denken .iniund .conf)
  • XML
  • Datenbanken (MySQL, SQLite ...)
  • .zip und ähnliches mit mehreren Dateien (mit unterschiedlichen Formaten)
  • Binärdateien (denken .docusw.), die beispielsweise von einem Serialisierungstool erstellt wurden)

Was sind verschiedene Anwendungsfälle für die oben aufgeführten Formate und welche Vor- und Nachteile haben sie (Geschwindigkeit, Flexibilität, Dateigröße, Benutzerfreundlichkeit ...)? Wie kann man sich für verschiedene Aufgaben zwischen ihnen entscheiden?

Informationen zum Zipping-Format: Dies wird nur zum Enthalten anderer Dateien verwendet. Es könnte auch ein anderes Komprimierungsformat sein. Dies ermöglicht die Strukturierung mehrerer Dateien, einschließlich Bilddateien, Audiodateien und Textdateien. Angenommen, Sie haben ein Speicherformat für Nachrichten, die möglicherweise Dateien enthalten. Sie können die folgenden Dateien in einer komprimierten Datei haben:

message.txt (containing the message)
attachments (folder containing attachments)
  audio.wav
  picture.jpg

Betrachten Sie als Binärdatei den Google Protocol Buffer. Die Fähigkeit zur verzögerten Deserialisierung ist fantastisch, und Sie haben immer die Möglichkeit, sie zu extrahieren und als formatierten Text erneut zu speichern (in mehreren Sprachen C ++ / Java / Python).
Matthieu M.

Antworten:


6

Ich benutze wie folgt:

Klartext

Zur Konfiguration - normalerweise mit YAML oder .ini. Von mir für die meisten Verwendungen veraltet, außer wenn eine Textdatei das gewünschte Ergebnis ist (z. B. Drucken in Text, Speichern in Text usw.)

XML

Zur Konfiguration und zum Transport von Daten; zB Exportieren, Formatieren über XSLT usw. Gut als tragbares Dateiformat (zB SVG). Hervorragende Manipulationswerkzeuge und Filter.

Datenbanken

Hauptdatenspeicher aus der App / Webapp heraus. Verwenden Sie es die ganze Zeit als Speicher Ihrer Wahl. Es ist zuverlässig, robust und es ist viel eingebaut (Transaktionen, referenzielle Integrität, kaskadierendes Löschen / Aktualisieren, Indizes, Geschwindigkeit). Am besten mit einer Ebene oder ORM (IMO) verwenden.

Einzeldateiarchiv (z. B. .zip)

Geeignet zum kompakten Speichern verwandter mehrerer Binärströme, z. B. ROM-Images für einen Emulator. Am besten für Dinge, die nicht oft oder nie aktualisiert werden müssen. Es ist schwer, langsam und schwer zu manipulieren;

Binär

Nur wenn keine Datenbank zum Speichern von App-Daten verfügbar ist. Am einfachsten mit Serialisierung (C ++). Ein hoch abgestimmtes Binärformat übertrifft alles andere in Bezug auf Geschwindigkeit und Größe.


4

Es gibt keine Silberkugel. Durch meine Erfahrung:

Klartext als Speichermedium ist eine automatische Nr. Die wenigen Fälle, die ich überhaupt in Betracht ziehen würde, werden besser von einer .config-Datei abgedeckt, in der ich ein Schema und eine Typensicherheit habe. Es scheint, dass das Bedürfnis nach Typensicherheit und Datenextraktion fast immer auftaucht. Klartext macht diesen Prozess zu einem Albtraum.

XML : Typensicherheit, Datenüberprüfung, geringes Volumen, und in einigen Fällen verwende ich es, da .NET eine leistungsstarke integrierte Unterstützung für die XML-Serialisierung von Objekten bietet.

Datenbanken : Meine Standardeinstellung. Geben Sie Sicherheit, Geschwindigkeit, Transaktionen, Vertrauen und die Schuld an der Auswahl einer Datenbank als Speichermedium ein, wenn etwas nicht nach Plan verläuft.

.zip ist ein Komprimierungsformat, nicht sicher, wie dies in die Persistenz passt ..?

Binär : Ich verwende Binär nur, wenn ich einen temporären Memorystream erstellen muss. Binär bietet keinen Mehrwert in Bezug auf die Abfragefähigkeit im Vergleich zu einer Datenbank oder XML, in der meine Daten mit einem Schema organisiert sind.

Die Benutzerfreundlichkeit ist relativ und hängt davon ab, was Sie konkret erreichen möchten. Die Geschwindigkeit ist ähnlich wie oben in Bezug auf die Lautstärke. Wenn die Dateigröße ein Problem darstellt und die richtige Normalisierung angewendet wird, werde ich sie über Zip oder ein anderes Komprimierungsformat komprimieren, dies ist jedoch ein separater Prozess.


3

Ich benutze sie wie folgt:

Klartext

Wenn diese Kategorie etwas ausgefeiltere Formate wie YAML oder Eigenschaftendateien enthält, ist dies die beste Option für alles, was die Benutzer von Hand lesen und bearbeiten sollen. Ein weiterer großer Vorteil ist die einfache Änderung über ein kleines Skript (z. B. sed).

Nichts geht über die Einfachheit und Benutzerfreundlichkeit. Wenn das Support-Team etwas auf einem Remotecomputer konfigurieren muss (z. B. das Problem eines Clients lösen muss) oder die IT eine Reihe von Servern neu konfigurieren muss, auf denen Ihre Software ausgeführt wird, wird es Ihnen dafür danken, dass Sie dieses Format ausgewählt haben. Es erspart Ihnen auch das Schreiben einer einmaligen Software, die dies für sie erledigt.

XML

Ich stimme @Ingo hier zu - im Gegensatz zu Klartext ist XML schwieriger per Skript zu verarbeiten und ein Albtraum, von Hand imo zu bearbeiten.

Wenn Sie jedoch Daten mit einer ausgeklügelten Struktur haben, bei der YAML nicht mehr zu entziffern ist und dennoch lesbar und bearbeitbar sein soll, ist XML wahrscheinlich die beste Wahl.

Relationale Datenbank

Eine gute Wahl, wenn Sie über viele Daten verfügen (die Klartext und XML umständlich machen würden), die Sie möglicherweise dennoch zulassen möchten, dass Dritte sie manuell bearbeiten - über SQL-Befehle und sogar GUIs.

Ein weiterer Vorteil ist, dass Ihr Code, der den Inhalt verwaltet, sehr gut lesbar ist. @ Richard-Harrison gab eine gute Liste anderer Vorteile in seiner ausgezeichneten Antwort.

NoSQL-Datenbank

Ein Vorteil gegenüber RDBMS ist die Skalierbarkeit durch Verteilung, die für Ihre Frage wahrscheinlich nicht sehr relevant ist. Die Vorteile, die wahrscheinlich relevanter sind, sind die Einfachheit eines Schlüsselwertspeichers und die Flexibilität der Schemalosigkeit (ist dies ein Wort?). Wenn Sie das relationale Paradigma brechen: Speichern Sie einfach Blobs in der Datenbank, greifen Sie per Schlüssel darauf zu und verarbeiten Sie sie über Code. Ziehen Sie dann diese Option in Betracht. Einige Optionen (z. B. CouchDB) sind sehr portabel, haben einen geringen Platzbedarf und können auch skaliert werden, sodass sie eine gute nicht relationale Alternative zu MySQL und SQLite darstellen.

Binär

Der Vorteil von Binär ist, dass es schnell und kompakt ist. Wenn das einzige, was Sie zum Lesen und Ändern Ihrer Datei benötigen, ein Programm ist und die Daten nicht zum relationalen Paradigma passen oder die Geschwindigkeit wirklich wichtig ist, ist dies möglicherweise eine gute Wahl. Wahrscheinlich am besten für Mediendateien geeignet.

Ich sollte jedoch darauf hinweisen, dass ich noch keinen Fall habe, in dem ein einfacher Zugriff auf Programmdaten aus Gründen, die bei der ersten Entwicklung nicht berücksichtigt wurden, irgendwann nicht mehr erforderlich ist. Heutzutage wähle ich persönlich die Datenbankoption für alles andere als Dateien, die Standardformate haben und von anderer Software (z. B. Audio, Video) codiert / decodiert werden müssen.

Hinweis: Es gibt ein weit verbreitetes Missverständnis, dass Binärdateien undurchsichtig und damit irgendwie sicherer sind. Ohne zusätzlichen Schutz ist dies nicht der Fall - wenn jemand Ihre Software hacken möchte, werden sie durch einfaches Speichern Ihrer Konfigurationen oder was auch immer in Binärform nicht gestoppt.

Komprimiertes Archiv

Nicht wirklich eine Alternative zu den oben genannten, sondern eine zusätzliche Maßnahme.

Vorteilhaft, wenn Sie Dinge über das Netzwerk übertragen müssen oder wenn Sie viele, viele Daten speichern und Platz sparen möchten. Beachten Sie, dass Speicherplatz heutzutage normalerweise reichlich vorhanden ist. Berücksichtigen Sie daher Ihre Zielplattform.

Funktioniert heute bei fast allem sehr schnell (Moores Gesetz in Aktion, Baby). Der einzige Grund, es nicht zu verwenden, besteht darin, dass es Ihrem Code Komplexität verleiht. Nicht viel Komplexität, aber dennoch ein Verstoß gegen das KISS-Prinzip. Besonders umständlich für Konfigurationsdateien, die manuell oder per Skript bearbeitet werden müssen - und wenn Sie dort wirklich Platz sparen müssen, sollten Sie wahrscheinlich die Datenbankoption verwenden.


2

Ich würde sie wie folgt verwenden:

  • Klartext : Die Anwendung hat eine geringe Größe einfach strukturierter Daten (z. B. Name-Wert-Paare). Daten werden nicht gleichzeitig von mehreren Benutzern geändert.
  • XML : Kleine strukturierte Daten, die nicht gleichzeitig oder häufig geändert werden.
  • Datenbank : Große strukturierte Daten oder gleichzeitiger Zugriff sind erforderlich. Die Notwendigkeit der Abfrage und Suche ist ein Muss in der Anwendung.
  • Binärdaten : Ich würde das nur zum Streamen von Objekten verwenden.
  • Das Zippen ist eine Komprimierung, die als ein weiterer Prozess für eine der oben genannten Methoden hinzugefügt werden kann, mit Ausnahme von Datenbanken auf Servern.

1

Ich habe gehört, dass XML die schlechtesten Funktionen von Text (schwierig / langsam zu verarbeiten) und Binär (unlesbar) kombiniert.


Keine vollständige Antwort
Anto
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.