Apakah ada alat yang dirancang khusus untuk mengompresi data ilmiah floating point?
Jika suatu fungsi halus, jelas ada banyak korelasi antara angka-angka yang mewakili fungsi itu, sehingga data harus dikompres dengan baik. Zipping / gzipping data floating point biner tidak kompres dengan baik. Saya bertanya-tanya apakah ada metode yang khusus dikembangkan untuk mengompresi data floating point.
Persyaratan:
Baik kompresi lossless atau kemungkinan untuk menentukan jumlah digit minimum untuk dipertahankan (untuk beberapa aplikasi
double
mungkin lebih dari apa yang kita butuhkan sementarafloat
mungkin tidak memiliki cukup presisi).Alat kerja yang teruji dengan baik (yaitu bukan hanya kertas yang menggambarkan metode teoritis).
Cocok untuk mengompresi data numerik 1D (seperti deret waktu)
Cross platform (harus bekerja di Windows)
Itu harus cepat --- lebih disukai tidak lebih lambat dari gzip. Saya menemukan bahwa jika saya memiliki nomor yang disimpan sebagai ASCII, gzipping file dapat mempercepat membaca dan memprosesnya (karena operasi mungkin terikat I / O).
Saya terutama ingin mendengar dari orang-orang yang benar-benar menggunakan alat semacam itu.
sumber
Jawaban:
Cobalah Blosc . Dalam banyak kasus, ini lebih cepat daripada memcopy . Pikirkan itu sebentar. . . jahat.
Ini sangat stabil, sangat diperiksa, lintas platform, dan melakukan seperti juara.
sumber
Saya mendapat hasil yang baik menggunakan HDF5 dan filter GZIP-nya.
HDF5 juga menyediakan filter SZIP yang mencapai hasil yang lebih baik untuk beberapa set data ilmiah.
Dalam pengalaman saya, pilihan kompresi sangat tergantung pada jenis data dan pembandingan mungkin satu-satunya cara untuk membuat pilihan yang baik.
BTW, filter pihak ketiga untuk HDF5 termasuk BLOSC, BZIP2, LZO, LZF, MAFISC.
sumber
Dapat diperdebatkan, Anda dapat menafsirkan metode regresi atau transformasi (Transformasi Fourier, transformasi Chebyshev) sebagai "kompresi" untuk data fungsi time-series atau 1D. Algoritma Remez akan menjadi kandidat lain. Dalam hal itu, menggunakan sesuatu seperti regresi, FFT, atau Chebyshev via FFT akan berfungsi untuk tujuan Anda. Yang mengatakan, tidak ada metode ini bekerja pada data deret waktu dengan struktur sewenang - wenang . Misalnya, dengan FFT, Anda mengasumsikan periodisitas, dan segala jenis diskontinuitas dalam data (atau kurangnya periodisitas) akan mengarah pada fenomena Gibbs . Demikian pula, dengan transformasi Chebyshev, asumsinya adalah bahwa data menggambarkan fungsi pada .[−1,1]
Bergantung pada fungsi yang mendasarinya, Anda mungkin dapat menyesuaikan data ke bentuk fungsional tanpa kesalahan, membutuhkan lebih sedikit koefisien untuk menggambarkan bentuk fungsional daripada yang Anda miliki titik data (mengarah ke kompresi). Hasil kesalahan ada untuk beberapa metode ini, meskipun saya tidak tahu apakah ada di antara mereka yang akan memberi Anda apriori (atau posteriori ) batas atau perkiraan kesalahan.
Anda juga bisa melihat metode yang dikembangkan secara khusus untuk kompresi angka floating point, seperti FPC dan algoritma terkait. Lihat makalah di sini , di sini , di sini , di sini , dan di sini , bersama dengan halaman web yang berisi kode sumber lama di sini .
sumber
HDF5 dapat menggunakan algoritma "pengocokan" di mana byte untuk angka floating point N diatur ulang sehingga byte pertama dari angka N datang terlebih dahulu, kemudian ke 2, dan seterusnya. Ini menghasilkan rasio kompresi yang lebih baik setelah gzip diterapkan, karena lebih cenderung menghasilkan urutan yang lebih lama dari nilai yang sama. Lihat di sini untuk beberapa tolok ukur .
sumber
SZ (dikembangkan oleh Argonne pada 2016) bisa menjadi pilihan yang baik.
SZ: Kompresor Data Floating-point Terikat Kesalahan Cepat untuk Aplikasi Ilmiah https://collab.cels.anl.gov/display/ESR/SZ
sumber
Metode yang mungkin, yang dapat digunakan untuk kompresi floating-point:
Transpose 4xN untuk float dan 8xN untuk double + lz77
Implementasi: Kompresi titik apung di TurboTranspose
lihat juga kompresi lossy yang terikat kesalahan
Predictor (mis. Metode Konteks Hingga) + penyandian (mis. "Kompresi integer").
Implementasi: Kompresi titik apung di TurboPFor
termasuk kompresi khusus untuk deret waktu.
bila memungkinkan, konversi semua angka floating point ke bilangan bulat (mis. 1,63 -> 163), lalu gunakan kompresi bilangan bulat
Anda dapat menguji semua metode ini dengan data Anda menggunakan alat icapp untuk linux dan windows.
sumber
Kami telah menggunakan ZFP dengan HDF5 untuk data pencitraan medis kami. Itu dibuat untuk kompresi lossy, floating point.
Kami menjalankannya di atas segalanya, dan menyimpan lebih dari 40TB data (dan sedang digunakan!) Cukup cepat untuk menyimpan data kami secara real-time, dan kami dapat menentukan presisi yang diperlukan, jadi sementara formatnya lossy, kami tidak melihat perbedaan dalam hasil akhir kami.
sumber
Mungkin format yang Anda perlukan harus menyimpan hanya offset dari nilai ke nilai tetangga.
Sebagai alternatif, mungkin Anda dapat menggunakan domain frekuensi, bahkan mungkin menyimpan nilai-nilai ini sebagai file audio lossless seperti "flac lossless", karena Anda memerlukan beberapa properti yang sama untuk suara.
Namun, saya akan mengambil pendekatan berbeda untuk mencoba menjawab pertanyaan yang saya harap dapat membantu. Seperti yang Anda katakan juga bahwa panjang deskripsi minimum untuk mewakili data ini kurang dari semua poin data.
https://en.wikipedia.org/wiki/Minimum_description_length
Secara efektif suatu program, kode komputer, adalah contoh yang baik. Dan jika Anda tidak keberatan bahwa sesuatu itu terutama data bekerja dengan mengeksekusi, dan juga menjadi kode, maka Anda bisa mengompresi nilai floating point Anda menjadi sesuatu seperti fungsi atau formuli.
Melakukan ini dengan sangat baik secara otomatis, dan dalam jumlah yang realistis, tidak sulit. Namun Bahasa Wolfram menyediakan beberapa fungsi untuk melakukan ini:
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
sumber
Mengapa tidak menyimpan saja float32 / float16? Di numpy,
Ini tidak akan dilakukan jika Anda mensimulasikan efek Kupu - kupu dalam teori chaos, tetapi dapat dimengerti, portabel, "tidak memerlukan pekerjaan apa pun di pihak saya". Dan kompresi 2: 1/4: 1 melebihi float64 sulit dikalahkan :)
Catatan:
"Tipe array float16 tidak didukung di np.linalg"; Anda harus mengembangkannya menjadi 32 atau 64 setelah membacanya.
Untuk melihat perbedaan parameter floating-point,
Untuk sebidang kasus uji sepele membandingkan float 64 32 dan 16, lihat di sini .
sumber