Gleitkommadaten werden komprimiert


26

Gibt es Tools, die speziell für die Komprimierung von wissenschaftlichen Gleitkommadaten entwickelt wurden?

Wenn eine Funktion glatt ist, besteht offensichtlich eine große Korrelation zwischen den Zahlen, die diese Funktion darstellen, sodass die Daten gut komprimiert werden sollten. Das Komprimieren / G-Komprimieren von binären Gleitkommadaten komprimiert sie jedoch nicht so gut. Ich frage mich, ob es eine Methode gibt, die speziell für das Komprimieren von Gleitkommadaten entwickelt wurde.

Bedarf:

  • Entweder verlustfreie Komprimierung oder die Möglichkeit, eine Mindestanzahl von Ziffern anzugeben, die beibehalten werden sollen (für einige Anwendungen ist doublemöglicherweise mehr als erforderlich, floatdie Genauigkeit jedoch möglicherweise nicht ausreichend).

  • Bewährtes Arbeitswerkzeug (dh nicht nur eine Arbeit, die eine theoretische Methode beschreibt).

  • Geeignet zum Komprimieren von numerischen 1D-Daten (z. B. Zeitreihen)

  • Plattformübergreifend (muss unter Windows funktionieren)

  • Es muss schnell sein - am besten nicht viel langsamer als gzip. Wenn ich die Nummern als ASCII gespeichert habe, kann ein ZIP-Vorgang das Lesen und Verarbeiten der Datei beschleunigen (da die Operation möglicherweise an E / A gebunden ist).

Ich würde besonders gerne von Leuten hören, die tatsächlich ein solches Tool verwendet haben.


Dies wurde teilweise durch die Existenz von FLAC inspiriert , was nahelegt, dass eine spezialisierte Methode (viel?) Besser sein sollte als gzip.
Szabolcs

Ich schaue das jetzt an.
Szabolcs

Ordentlich. Ich werde diesem einen Wirbel geben.
Meawoppl

Antworten:


22

Probieren Sie Blosc aus . Es ist in vielen Fällen schneller als memcopy . Denken Sie eine Sekunde darüber nach. . . böse.

Es ist super stabil, hochgradig geprüft, plattformübergreifend und funktioniert wie ein Champion.


oh wow, das ist wirklich cool (und neu für mich!)
Aron Ahmadia

Die Verbindung ist unterbrochen. Haben Sie eine Chance zu wissen, wo es jetzt ist?
Alexis Wilke

1
@AlexisWilke Ich habe den Link repariert. Es war das erste Ergebnis einer Google-Suche nach Blosc.
Doug Lipinski

1
Blosc ist vielleicht schnell, aber seine Komprimierungsrate auf Float-Arrays ist eine Katastrophe. Mit der besten Komprimierung, die es bietet, werden ca. 98% der Originalgröße erzielt. Danke auf jeden Fall für den Tipp.

Die Komprimierung von Float-Arrays hängt stark vom Inhalt ab. Ich vermute, es gibt wenig (strukturierte) Informationen in den Bits, die Sie komprimieren. Außerdem ist blosc 5 Jahre später immer noch unter aktiver Entwicklung!
meawoppl

7

Ich habe mit HDF5 und seinem GZIP-Filter gute Ergebnisse erzielt .

Das HDF5 bietet auch einen SZIP- Filter, der für einige wissenschaftliche Datensätze bessere Ergebnisse erzielt.

Nach meiner Erfahrung hängt die Wahl der Komprimierung stark von der Art der Daten ab, und Benchmarking ist wahrscheinlich die einzige Möglichkeit, eine gute Wahl zu treffen.

Zu den Drittanbieterfiltern für HDF5 gehören übrigens BLOSC, BZIP2, LZO, LZF, MAFISC.


Danke für die Antwort! Ich habe HDF5 nicht viel benutzt. Ist es richtig, dass die Verwendung des gzip-Filters mit dem HDF5-Format die gleiche Komprimierungsrate ergibt wie das Schreiben der gesamten Zahl in eine flache Binärdatei und das Ausführen durch gzip? (Ignorieren Sie die mögliche Bequemlichkeit / Unbequemlichkeit der Verwendung von HDF5 im Moment.) Ist es in Bezug auf SZIP in irgendeiner Weise für Gleitkommadatensätze optimiert? (Ich bin neugierig und das wird nicht deutlich, wenn Sie die von Ihnen verlinkte Seite überfliegen.) Auf der Seite heißt es, dass der Hauptvorteil von SZIP die Geschwindigkeit ist. GZIP ist auch ziemlich bissig (normalerweise ist die GZIP-Dekomprimierung für mich vernachlässigbar).
Szabolcs

Eine gzippte flache Binärdatei ist wahrscheinlich kleiner als eine HDF5-Datei mit gzip-Filter, da HDF5 mehr als Rohdaten ist. Manchmal kann die Vorverarbeitung mit einem Shuffle-Filter die GZIP-Ergebnisse verbessern. Aber Sie haben Recht, die Vorteile sind in der Tat eher Bequemlichkeit. Mit HDF5 finde ich es einfach, den Komprimierungsfilter zu ändern (verschiedene Einstellungen ausprobieren) und HDF5 bietet Funktionen für den Zugriff auf Teilmengen Ihrer Daten (Intervalle in Zeitreihen).
f3lix

1
Wenn Sie diese Route wählen , schauen Sie sich pyTables an . Es macht das oben nur ein paar Zeilen Code. Wird (vorher mindestens) vom Autor von Blosc gepflegt.
Meawoppl

6

Möglicherweise können Sie Regressions- oder Transformationsmethoden (Fourier-Transformation, Chebyshev-Transformation) als "Komprimierung" für Zeitreihen- oder 1D-Funktionsdaten interpretieren. Remez 'Algorithmus wäre ein weiterer Kandidat. In diesem Fall würde die Verwendung von Regression, FFT oder Chebyshev über FFT für Ihre Zwecke funktionieren. Keine dieser Methoden funktioniert jedoch mit Zeitreihendaten mit willkürlicher Struktur. Bei FFT wird beispielsweise von Periodizität ausgegangen, und jede Art von Diskontinuität in den Daten (oder mangelnde Periodizität) führt zum Gibbs-Phänomen . In ähnlicher Weise wird bei Chebyshev-Transformationen angenommen, dass die Daten eine Funktion für .[1,1]

Abhängig von der zugrunde liegenden Funktion können Sie die Daten möglicherweise fehlerfrei an ein funktionales Formular anpassen, sodass weniger Koeffizienten zur Beschreibung des funktionalen Formulars erforderlich sind, als Sie über einen Datenpunkt verfügen (was zur Komprimierung führt). Für einige dieser Methoden liegen Fehlerergebnisse vor , obwohl ich nicht weiß, ob Ihnen eine davon a priori (oder a posteriori ) Grenzen oder Schätzungen für den Fehler aufzeigt.

Sie können sich auch Methoden ansehen, die speziell für die Komprimierung von Gleitkommazahlen entwickelt wurden, z. B. FPC und verwandte Algorithmen. Sehen Sie sich die Papiere hier , hier , hier , hier und hier , zusammen mit einer Web - Seite mit alten Quellcode hier .


Eigentlich interessiere ich mich für fertige gzip-ähnliche Tools, die von mir keine Arbeit erfordern, insbesondere keine eigene Methode zu entwickeln und zu optimieren. Es wäre auch vorteilhaft, eine Methode zu haben, bei der das Ganze nicht vor dem Dekomprimieren in den Speicher eingelesen werden muss, da möglicherweise sehr große Datendateien vorhanden sind, die sequentiell verarbeitet werden können (dies funktioniert mit gzip, aber nicht, wenn ich einen Fourier verwende transformieren, es sei denn, ich schneide die Daten selbst in Stücke, was das Ganze noch komplizierter macht.) Etwas, das davon ausgeht, dass meine Datendatei nur eine Reihe von binären Doppelwerten ist, wäre ausgezeichnet.
Szabolcs

Auch dies sind 1: 1-Transformationen, die eigentlich keine Komprimierungstechniken sind. Sie können verwendet werden, um Daten zu erstellen, mit denen ein naiver Komprimierungsalgorithmus besser umgehen kann, die jedoch keine eigenständige Lösung darstellen.
Meawoppl

Einige dieser Methoden bilden die mathematische Grundlage für Kompressionsalgorithmen, die in der Signalverarbeitung verwendet werden. Dies war die Idee hinter der Antwort. Diese Transformationen sind in der Regel nur unter bestimmten Umständen 1: 1.
Geoff Oxberry

3

HDF5 kann einen "Shuffling" -Algorithmus verwenden, bei dem die Bytes für N Gleitkommazahlen so neu angeordnet werden, dass die ersten Bytes der N Zahlen zuerst kommen, dann die zweiten und so weiter. Dies führt nach dem Anwenden von gzip zu besseren Komprimierungsverhältnissen, da es wahrscheinlicher ist, dass längere Sequenzen mit demselben Wert erstellt werden. Sehen Sie hier für einige Benchmarks .


1

SZ (von Argonne im Jahr 2016 entwickelt) könnte eine gute Wahl sein.

SZ: Schneller fehlergebundener Gleitkomma-Datenkompressor für wissenschaftliche Anwendungen https://collab.cels.anl.gov/display/ESR/SZ


Warum denkst du, könnte es eine gute Wahl sein? Was sind seine Fähigkeiten im Vergleich zu anderen Komprimierungstechniken?
Paul

1

Mögliche Methoden, die für die Gleitkommakomprimierung verwendet werden können:

  • Transponieren Sie 4xN für float und 8xN für double + lz77.
    Implementierung: Gleitkommakomprimierung in TurboTranspose,
    siehe auch Fehlerbedingte verlustbehaftete Komprimierung

  • Prädiktor (zB Finite Context Method) + Codierung (zB "Integer Compression").
    Implementierung: Gleitkommakomprimierung in TurboPF,
    einschließlich spezieller Komprimierung für Zeitreihen.

  • Konvertieren Sie nach Möglichkeit alle Gleitkommazahlen in Ganzzahlen (z. B. 1,63 -> 163) und verwenden Sie dann die Ganzzahlkomprimierung

  • Sie können all diese Methoden mit Ihren Daten testen, indem Sie das icapp- Tool für Linux und Windows verwenden.


1

Wir haben ZFP mit HDF5 für unsere medizinischen Bildgebungsdaten verwendet. Es ist für verlustbehaftete Gleitkommakomprimierung ausgelegt.

Wir verwenden buchstäblich alles und haben mehr als 40 TB Daten gespeichert (und werden verwendet!). Es ist schnell genug, um unsere Daten in Echtzeit zu speichern, und wir können die erforderliche Genauigkeit angeben, sodass wir bei verlustbehafteten Formaten keine Unterschiede bei unseren endgültigen Ausgaben feststellen.


0

Wenn eine Funktion glatt ist, besteht offensichtlich eine große Korrelation zwischen den Zahlen, die diese Funktion darstellen, sodass die Daten gut komprimiert werden sollten.

Möglicherweise muss das von Ihnen benötigte Format nur die Offsets vom Wert zum benachbarten Wert speichern.

Alternativ können Sie auch den Frequenzbereich verwenden und diese Werte sogar als verlustfreie Audiodatei wie "flac lossless" speichern, da Sie für einen Sound einige der gleichen Eigenschaften benötigen.

Ich werde jedoch einen anderen Ansatz verfolgen, um zu versuchen, die Frage zu beantworten, von der ich hoffe, dass sie hilfreich sein kann. Sie sagen damit auch, dass die Mindestbeschreibungslänge zur Darstellung dieser Daten geringer ist als die Angabe aller Datenpunkte.

https://en.wikipedia.org/wiki/Minimum_description_length

Tatsächlich ist ein Programm, Computercode, ein gutes Beispiel. Und wenn es Ihnen nichts ausmacht, dass etwas, das hauptsächlich aus Daten besteht, die ausgeführt werden, und das auch Code ist, können Sie Ihre Gleitkommawerte in eine Art Funktion oder Formel komprimieren.

Dies besonders gut automatisch und mit realistischem Rechenaufwand zu tun, ist nicht schwer. Die Wolfram-Sprache bietet jedoch einige Funktionen, um dies zu versuchen:

https://reference.wolfram.com/language/ref/FindSequenceFunction.html https://reference.wolfram.com/language/ref/FindGeneratingFunction.html https://reference.wolfram.com/language/ref/FindFormula. html

https://reference.wolfram.com/language/ref/RSolve.html


0

Warum nicht einfach float32 / float16 speichern? In numpy,

A.astype( np.float32 )  # 100M: 200 msec imac
A.astype( np.float16 )  # 100M: 700 msec

Diese funktionieren nicht, wenn Sie den Schmetterlingseffekt in der Chaostheorie simulieren , aber sie sind verständlich, portabel und "erfordern keine Arbeit von meiner Seite". Und die Komprimierung 2: 1/4: 1 über float64 ist schwer zu übertreffen :)

Anmerkungen:

"Der Array-Typ float16 wird in np.linalg nicht unterstützt"; Sie müssen es nach dem Einlesen auf 32 oder 64 erweitern.

Um zu sehen, wie sich Gleitkomma-Parameter unterscheiden,

import numpy as np
for f in [np.float64, np.float32, np.float16]:
    print np.finfo(f)

Eine grafische Darstellung eines einfachen Testfalls zum Vergleich von Float 64, 32 und 16 finden Sie hier .

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.