浮動小数点データの圧縮


26

浮動小数点科学データを圧縮するために特別に設計されたツールはありますか?

関数がスムーズである場合、その関数を表す数値の間には明らかに多くの相関関係があるため、データは十分に圧縮されるはずです。ただし、バイナリ浮動小数点データを圧縮/ gzip圧縮しても、圧縮はうまくいきません。浮動小数点データを圧縮するために特別に開発された方法があるのだろうか。

要件:

  • ロスレス圧縮、または保持する最小桁数を指定する可能性(アプリケーションdoubleによっては、必要floatな精度よりも高い精度が必要な場合があります)。

  • 十分にテストされた作業ツール(つまり、理論的な方法を説明する論文だけではありません)。

  • 1D数値データ(時系列など)の圧縮に適しています

  • クロスプラットフォーム(Windowsで動作する必要があります)

  • それは高速でなければなりません---できればgzipよりも遅くないことが望ましいです。数値をASCIIとして保存している場合、ファイルをgzipすることで、読み取りと処理を高速化できます(操作がI / Oにバインドされている可能性があるため)。

私は特に、実際にそのようなツールを使用した人々から話を聞きたいです。


これはFLACの存在に一部影響を受けました。FLACの存在は、gzipよりも特化されたメソッドの方が(はるかに)優れていることを示唆しています。
ザボルクス

私は今これを見てます。
ザボルクス

きちんとした。これに旋回を与えます。
meawoppl

回答:


22

Bloscを試してください。多くの場合、memcopyよりも高速です。少し考えてみてください。。。邪悪。

非常に安定しており、十分に吟味されたクロスプラットフォームであり、チャンピオンのように動作します。


ああすごい、これは本当にクールです(そして私にとっては新しい!)
アロンアフマディア

リンクが壊れています。今どこにあるのか知っていますか?
アレクシスウィルケ

1
@AlexisWilkeリンクを修正しました。これは、BloscのGoogle検索の最初の結果でした。
ダグリピンスキー

1
Bloscは高速かもしれませんが、float配列での圧縮率は災害です。最高の圧縮により、元のサイズの約98%が得られます。いずれにせよ、ヒントをありがとう。

float配列の圧縮は、コンテンツに大きく依存します。圧縮しているビットに(構造化された)情報がほとんどないと思われます。また、bloscは5年後もまだアクティブな開発中です!
meawoppl

7

HDF5とそのGZIPフィルターを使用して良い結果を得ました。

HDF5は、一部の科学データセットに対してより良い結果を達成するSZIPフィルターも提供します。

私の経験では、圧縮の選択はデータの種類に大きく依存しており、ベンチマークがおそらく適切な選択を行う唯一の方法です。

ところで、HDF5のサードパーティフィルターには、BLOSC、BZIP2、LZO、LZF、MAFISCが含まれます。


答えてくれてありがとう!HDF5はあまり使用していません。HDF5形式でgzipフィルターを使用すると、すべての数値をフラットバイナリファイルに書き込み、gzipで実行するのと同じ圧縮率が得られますか?(現時点ではHDF5を使用することの利便性/不便さを無視してください。)SZIPに関しては、何らかの方法で浮動小数点データセット用に最適化されていますか?(私は興味があり、これはあなたがリンクしたページをざっと読むことから明らかではありません。)ページはSZIPの主な利点が速度であると言います。また、GZIPは非常に機敏です(通常、gzipの解凍にかかる時間はごくわずかです)。
ザボルクス

HDF5は生データ以上のものであるため、gzip圧縮されたフラットバイナリファイルはおそらく、gzipフィルターを使用したHDF5ファイルよりも小さくなります。シャッフルフィルターを使用した前処理により、gzipの結果が改善される場合があります。しかし、あなたは正しいです、利点は実際にはむしろ便利です。HDF5を使用すると、圧縮フィルターを簡単に変更できます(さまざまな設定を試してみてください)。HDF5は、データのサブセット(時系列の間隔)にアクセスする機能を提供します。
f3lix

1
このルートに行く場合は、pyTablesをチェックしてください。上記のコードを数行だけにします。Bloscの作者によって(少なくとも以前は)維持されています。
meawoppl

6

[1,1]

基礎となる関数によっては、エラーなしでデータを関数型に適合させることができ、関数型を記述するために必要な係数がデータポイントよりも少なくなる場合があります(圧縮につながります)。これらのメソッドのいくつかにはエラー結果が存在しますが、それらのいずれかがエラーの事前(または事後)境界または推定値を与えるかどうかはわかりません。

FPCや関連するアルゴリズムなど、浮動小数点数の圧縮専用に開発されたメソッドも見ることができます。論文を参照してください。ここではここではここではここでは、とここでは古いソースコードを含むWebページと一緒に、ここに


実際、私はgzipに似た既成のツールに興味があります。これは特に作業を必要とせず、特に独自のメソッドを開発および調整する必要はありません。また、順次処理できる非常に大きなデータファイルがある可能性があるため、解凍する前にすべてをメモリに読み込む必要のないメソッドがあると有利です(これはgzipで動作しますが、フーリエを使用する場合は動作しませんデータを自分でチャンクにスライスして、全体をさらに複雑にしない限り、変換します)私のデータファイルが単なる一連のバイナリダブルであると仮定するものは素晴らしいでしょう。
ザボルクス

また、これらは実際には圧縮技術ではない1:1変換です。それらを使用して、単純な圧縮アルゴリズムでより良いデータを作成できますが、ソリューションとしてではなくスタンドアロンで使用できます。
meawoppl

これらの方法のいくつかは、信号処理で使用される圧縮アルゴリズムの数学的基礎を形成します。これは答えの背後にある考え方でした。これらの変換は通常、特別な状況を除いて1:1ではありません。
ジェフオックスベリー

3

HDF5では、N個の浮動小数点数のバイトが再配置され、N個の数字の最初のバイトが最初に、次に2番目のバイトというように並べ替えられる「シャッフル」アルゴリズムを使用できます。これにより、同じ値のより長いシーケンスが生成される可能性が高くなるため、gzipの適用後に圧縮率が向上します。ベンチマークについてはこちらをご覧ください。


1

SZ(2016年にアルゴンヌが開発した)は良い選択かもしれません。

SZ:科学アプリケーション向けの高速エラー制限付き浮動小数点データコンプレッサー https://collab.cels.anl.gov/display/ESR/SZ


なぜそれが良い選択だと思いますか?他の圧縮技術と比較した場合の機能は何ですか?
ポール

1

浮動小数点圧縮に使用できる可能な方法:

  • フロートの場合は4xN、ダブル+ lz77の場合は8xNをトランスポーズします。
    実装:TurboTransposeでの浮動小数点圧縮は、
    エラー制限のある損失のある圧縮も参照してください。

  • 予測子(例:有限コンテキスト法)+エンコード(例:「整数圧縮」)。
    実装: 時系列の特別な圧縮を含むTurboPForの浮動小数点圧縮

  • 可能であれば、すべての浮動小数点数を整数に変換し(例:1.63-> 163)、整数圧縮を使用します

  • LinuxおよびWindows用のicappツールを使用して、これらのすべてのメソッドをデータでテストできます。


1

私たちは医療画像データにZFPとHDF5を使用しています。損失の多い浮動小数点圧縮用に作成されています。

文字通りすべてで実行しており、40TB以上のデータが保存されています(使用中です!)。データをリアルタイムで保存するのに十分な速さであり、必要な精度を指定できます。そのため、形式は非可逆ですが、最終出力に違いは見られません。


0

関数がスムーズである場合、その関数を表す数値の間には明らかに多くの相関関係があるため、データは十分に圧縮されるはずです。

おそらく、必要な形式では、値から隣接する値までのオフセットのみを保存する必要があります。

または、周波数ドメインを使用して、サウンドに同じプロパティの一部が必要な場合、これらの値を「flac lossless」などのロスレスオーディオファイルとして保存することもできます。

しかし、私はいくつかの助けになることを望んでいる質問に答えるのを試みるために異なるアプローチをとるつもりです。あなたが言っているように、このデータを表す最小の説明の長さは、すべてのデータポイントを提供するよりも短いということです。

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

事実上、プログラム、コンピューターコードは良い例です。そして、実行によって主に動作するデータであり、コードでもあることを気にしないのであれば、浮動小数点値を関数や式のようなものに圧縮することができます。

これを特に自動的に、そして現実的な量の計算で行うのは難しいです。しかし、Wolfram言語はこれを試みるためのいくつかの機能を提供します:

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

なぜfloat32 / float16を保存しないのですか?numpyでは、

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

カオス理論でバタフライ効果をシミュレートしている場合、これらは機能しません が、理解可能で移植性があり、「私の側で作業を必要としません」。また、float64を超える2:1/4:1の圧縮は打ちにくい:)

ノート:

「np.linalgでは、配列型float16はサポートされていません」; 読み込んだ後に32または64に拡張する必要があります。

浮動小数点パラメーターの違いを確認するには、

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

float 64 32と16を比較する簡単なテストケースのプロットについては、こちらを参照して ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.