Binäre vs. ASCII-Dateigröße

17

Ich muss einige Daten aus einer Berechnung schreiben, die später von Paraview gelesen werden (.vtu- oder vtk-Datei).

Soll ich mich bei der Dateigröße für das ASCII-Format oder das Binärformat entscheiden?

SAAD
quelle

Antworten:

20

Wenn Ihre einzige Sorge die Dateigröße ist, möchten Sie Binärdateien. Nehmen wir für ein anschauliches Beispiel an, Sie schreiben eine Gleitkommazahl mit doppelter Genauigkeit in eine Datei. Nehmen wir an, dass das Dateisystem dies perfekt handhabt und alle Werte für Datei, Header und Auffüllung 0 sind.

Für eine Binärdatei würde diese Zahl die genaue Größe der Zahl im RAM oder 8 Bytes annehmen.

Im ASCII-Format würde es halten:

  • 16 Stellen der Basis
  • 1 Punkt für die Dezimalstelle
  • 1 Zeichen zur Begrenzung des Exponenten
  • 1 Zeichen für das Vorzeichen des Exponenten
  • 2-3 Zeichen für den Exponenten

Angenommen, es wird nur 1 Byte für ein Zeichen verwendet. Das sind 22 Byte, um dieselbe Nummer zu speichern. Hierbei werden nicht die Zeichen gezählt, die zum Abgrenzen zwischen den Zahlen erforderlich sind (normalerweise mindestens 1). Daher ist die Dateigröße für das ASCII-Format etwa dreimal so groß.

Sie können die Dateigröße gegen die Genauigkeit der gespeicherten Dateien eintauschen (behalten Sie nur 5-6 Stellen in der Basis bei), aber das hängt davon ab, wofür Sie sie verwenden. Der Hauptvorteil von ASCII ist das Debuggen oder Erzeugen von lesbaren Daten.

Godric Seher
quelle
3
Wichtig im wissenschaftlichen Bereich ist auch die Langzeitarchivierung und die zuverlässige Weitergabe. Deshalb ist ASCII CSV trotz seiner Ineffizienzen weit verbreitet und wird empfohlen (PDF) .
Horchler
2
Ein weiterer nützlicher Punkt ist, dass, obwohl die ASCII-CSV-Codierung nicht sehr effizient ist, die Verwendung eines Dateikomprimierungsdienstprogramms (wie zip, gzip usw.) für Ihre ASCII-Datei die Dateigröße normalerweise auf eine Größe verringert, die der Größe einer Binärdatei ähnelt .
Brian Borchers
3
Seien Sie vorsichtig, da einige Eingabe- / Ausgabebibliotheken nicht vorsichtig genug sind, um Bit für Bit-Reproduzierbarkeit zu erhalten, wenn Sie IEEE Double Precision-Zahlen in ASCII ausgeben und sie dann wieder einlesen. Nach meiner Erfahrung ist die Verwendung von 17 oder 18 Dezimalstellen manchmal aus Sicherheitsgründen erforderlich .
Brian Borchers
5
Zum Kommentar von Horchler: Ich bin mir sicher, dass weit verbreitete, standardisierte offene Binärformate wie HDF5 noch lange existieren werden. Das würde ich persönlich empfehlen.
AlexE
1
+ Ich halte mich, wann immer möglich, an Binärdateien, um Genauigkeit, Kompaktheit, Seelenfrieden und (besonders) Geschwindigkeit zu gewährleisten. Wenn ich dann mehr Kompaktheit brauche, kann ich es mit einem Reißverschluss verschließen. Wenn ich den Inhalt visuell lesen kann, kann ich ein kleines Programm dafür schreiben. Auf der anderen Seite ist CSV der richtige Weg, wenn es wichtiger ist, visuell zu sein und einfach an zufällige Programme wie Excel, R usw. weitergegeben zu werden.
Mike Dunlavey
15

In der Praxis benötigen Sie selten Daten in Visualisierungsdateien, die genauer sind als beispielsweise drei gültige Ziffern. In diesem Fall ist ASCII - vielleicht überraschend - oft kompakter als eine binäre Form. Wenn Sie über eine Archivierung nachdenken, wird das Bezipen dieser ASCII-Dateien wahrscheinlich die kleinsten Dateien ergeben, die Sie erhalten können.

Das heißt, Paraview liest das VTU-Format, das eine komprimierte Binärform hat (XML-basiert, aber die Daten werden zuerst libz-komprimiert und dann erneut uuencodiert, um ASCII-Text zu erhalten). Bei typischen Dateien spart dies einen Faktor von 4-10. Für große Dateien ist dies definitiv der richtige Weg.

Wolfgang Bangerth
quelle
2
Ich habe das für den Kontrast zur anderen Antwort gestimmt. Ich habe auch keine feste Meinung, aber es gibt einen guten Grund, hier zu sein.
Bill Barth
Alternativ können Sie die niedrigen Bits explizit auf Null setzen und die Binärdatei komprimieren.
Jed Brown
Wow, das würde einiges an Fummelei erfordern. Oder gibt es Funktionen, die das machen? (
Abgesehen vom