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
double
möglicherweise mehr als erforderlich,float
die 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.
quelle
Antworten:
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.
quelle
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.
quelle
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 .
quelle
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 .
quelle
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
quelle
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.
quelle
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.
quelle
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
quelle
Warum nicht einfach float32 / float16 speichern? In numpy,
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,
Eine grafische Darstellung eines einfachen Testfalls zum Vergleich von Float 64, 32 und 16 finden Sie hier .
quelle