Kayan nokta verilerini sıkıştırma


26

Kayan nokta bilimsel verilerinin sıkıştırılması için özel olarak tasarlanmış araçlar var mı?

Bir işlev düzgün ise, bu işlevi temsil eden sayılar arasında çok fazla korelasyon vardır, bu nedenle veriler iyi sıkıştırılmalıdır. İkili kayan nokta verilerini sıkıştırmak / gzipping yapmak o kadar iyi sıkıştırmaz. Kayan nokta verilerini sıkıştırmak için özel olarak geliştirilmiş bir yöntem olup olmadığını merak ediyorum.

Gereksinimler:

  • Kayıpsız sıkıştırma ya da saklanacak minimum basamak sayısını belirleme imkanı (bazı uygulamalar için doubleihtiyaç duyduğumuzdan daha fazla floatolabilir ancak yeterince kesinliğe sahip olmayabilir).

  • İyi test edilmiş çalışma aracı (yani sadece teorik bir yöntemi tanımlayan bir makale değil).

  • 1D sayısal verilerin sıkıştırılması için uygundur (zaman dizileri gibi)

  • Çapraz platform (Windows üzerinde çalışması gerekir)

  • Bu olmalı hızlı tercihen değil çok daha yavaş gzip daha ---. ASCII olarak kaydedilmiş numaralara sahipsem, dosyanın gzipping işleminin okunmasını ve işlenmesini hızlandırabileceğini buldum (işlem G / Ç bağlı olabilir).

Özellikle böyle bir aracı kullanan insanlardan haber almak istiyorum.


Bu kısmen varlığını esinlenerek FLAC bir uzman yöntem yapması gerektiğini önermektedir (kadar?) Daha iyi gzip daha.
Szabolcs

Benim baktığım bu şimdi.
Szabolcs

Temiz. Bu sefer bir koşuşturma vereceğim.
meawoppl

Yanıtlar:


22

Deneyin Blosc . Çoğu durumda , baskısından daha hızlıdır . Bunu bir saniyeliğine düşün. . . kötü.

Süper kararlı, son derece zeki, çapraz platformlu ve şampiyon gibi davranıyor.


oh vay, bu gerçekten harika (ve benim için yeni!)
Aron Ahmadia

Bağlantı koptu. Şimdi nerede olduğunu bilme ihtimalin var mı?
Alexis Wilke

1
@AlexisWilke Bağlantıyı düzelttim. Blosc için google aramada ilk sonuç oldu.
Doug Lipinski,

1
Blosc belki hızlıdır ancak yüzer dizilerdeki sıkıştırma oranı bir felakettir. En iyi sıkıştırma ile orijinal boyutunun yaklaşık% 98'ine neden olur. Her durumda bahşiş için teşekkürler.

Yüzer dizilerde sıkıştırma, büyük oranda içeriğe bağlıdır. Sıkıştırdığınız bitlerde (yapılandırılmış) az bilgi olduğundan şüpheleniyorum. Ayrıca, 5 yıl sonra blosc hala aktif durumda!
meawoppl 16:17

7

HDF5 ve GZIP filtresini kullanarak iyi sonuçlar aldım .

HDF5 ayrıca bazı bilimsel veri kümeleri için daha iyi sonuçlar elde eden bir SZIP filtresi sunar.

Tecrübelerime göre, sıkıştırma seçimi büyük ölçüde veri türüne bağlıdır ve kıyaslama muhtemelen iyi bir seçim yapmanın tek yoludur.

BTW, HDF5 için üçüncü taraf filtreleri BLOSC, BZIP2, LZO, LZF, MAFISC'dir.


Cevap için teşekkürler! HDF5'i fazla kullanmadım. Gzip filtresini HDF5 formatıyla kullanmamın, bana tüm sayıları düz bir ikili dosyaya yazmak ve gzip üzerinden çalıştırmakla aynı sıkıştırma oranını vereceği doğru mu? (Şimdilik HDF5 kullanmanın olası rahatlığını / uygunsuzluğunu dikkate almayın.) SZIP ile ilgili olarak, bir şekilde kayan nokta veri kümeleri için optimize edilmiş midir? (Merak ediyorum ve bu, bağladığınız sayfayı gözden geçirmekten çekinmiyor.) Sayfa, SZIP'in birincil avantajının hız olduğunu söylüyor. GZIP de oldukça hızlıdır (genellikle gzip sıkıştırması benim için önemsizdir).
Szabolcs

Bir gzipli düz ikili dosya muhtemelen gzip filtreli bir HDF5 dosyadan daha küçük olacaktır, çünkü HDF5 ham veriden daha fazladır. Bazen bir karıştırıcı filtreyle ön işleme, gzip sonuçlarını iyileştirebilir. Ama haklısın, avantajlar gerçekten daha kolay. HDF5 ile sıkıştırma filtresini değiştirmeyi kolay buluyorum (farklı ayarlar deneyin) ve HDF5 verilerinizin alt kümelerine erişme işlevi (zaman serilerindeki aralıklar) sağlar.
f3lix

1
Bu rotaya giderseniz pyTable'ları kontrol edin . Yukarıdakileri sadece birkaç satır kod yapar. Blosc yazar tarafından (en azından önceden) korunur.
meawoppl

6

[-1,1]

Temel fonksiyona bağlı olarak, işlevsel formu tanımlamak için veri noktasına sahip olduğunuzdan daha az katsayıya ihtiyaç duyan (işlevselliğe yol açan) daha az katsayı gerektiren verileri işlevsel bir forma sığdırabilirsiniz. Bu yöntemlerin bazıları için hata sonuçları var, ancak bunlardan herhangi birinin size bir priori (veya bir posteriori ) hatası vereceğini ya da tahmin edeceğini bilmiyordum .

Ayrıca FPC ve ilgili algoritmalar gibi kayan nokta sayılarının sıkıştırılması için özel olarak geliştirilen yöntemlere de bakabilirsiniz. Kağıtları bakın burada , burada , burada , burada ve burada eski kaynak kodunu içeren bir web sayfası ile birlikte burada .


Aslına bakarsanız, benim tarafımda herhangi bir çalışmayı gerektirmeyen, özellikle kendi yöntemimi geliştirip ayarlamamak için gzip'e benzer hazır araçlar ilgimi çekiyor. Ayrıca, sırayla işlenebilecek çok büyük veri dosyalarına sahip olabileceğimden (bu, gzip ile çalışır, ancak bir Fourier kullanmıyorsam, çok büyük veri dosyalarına sahip olabileceğimden), sıkıştırmadan önce her şeyi belleğe okumayı gerektirmeyen bir yönteme sahip olmak avantajlı olurdu. veriyi parçalara ayırmadığım sürece dönüştürme, her şeyi daha da karmaşık hale getirme) Veri dosyalarımın sadece bir çift ikili çift serisi olduğunu varsayan bir şey mükemmel olurdu.
Szabolcs

Ayrıca bunlar 1: 1 dönüşümlerdir, gerçekte sıkıştırma teknikleri değildir. Naif bir sıkıştırma algoritmasının daha iyi yapabileceği bir veri oluşturmak için kullanılabilir, ancak bunlar bağımsız bir çözüm değildir.
meawoppl

Bu yöntemlerden bazıları, cevabın arkasındaki fikir olan sinyal işlemede kullanılan sıkıştırma algoritmalarının matematiksel temelini oluşturur. Bu dönüşümler, özel durumlar dışında genellikle 1: 1 değildir.
Geoff Oxberry

3

HDF5, N kayan nokta numaralarının baytlarının, N numaralarının ilk baytlarının önce, sonra 2. ve böylece gelmesi için yeniden düzenlendiği bir "karıştırma" algoritması kullanabilir. Bu, aynı değerde daha uzun dizilerin üretilmesi daha muhtemel olduğundan, gzip uygulandıktan sonra daha iyi sıkıştırma oranları üretir. Bazı kıyaslamalar için buraya bakınız .


1

SZ (2016 yılında Argonne tarafından geliştirilmiştir) iyi bir seçim olabilir.

SZ: Bilimsel Uygulamalar İçin Hızlı Hata Sınırlı Kayan Noktalı Veri Kompresörü https://collab.cels.anl.gov/display/ESR/SZ


Neden iyi bir seçim olabileceğini düşünüyorsun? Diğer sıkıştırma tekniklerine kıyasla yetenekleri nelerdir?
Paul

1

Kayan nokta sıkıştırma için kullanılabilecek olası yöntemler:

  • Yüzdürme için 4xN ve çift + lz77 için 8xN için Transpoze
    Uygulama: TurboTranspose'da kayan nokta sıkıştırması
    ayrıca hataya bağlı kayıplı sıkıştırma bölümüne bakın

  • Öngörücü (örn. Sonlu İçerik Yöntemi) + kodlama (ör. "Tamsayı sıkıştırma")
    Uygulama: TurboPFor'da kayan nokta sıkıştırma,
    zaman serileri için özel sıkıştırma dahil.

  • mümkünse, tüm kayan nokta sayılarını tam sayılara dönüştürün (ör. 1.63 -> 163), sonra tamsayı sıkıştırmayı kullanın

  • Tüm bu yöntemleri, linux ve windows için icapp aracını kullanarak verilerinizle test edebilirsiniz .


1

Tıbbi görüntüleme verilerimiz için ZFP'yi HDF5 ile kullanıyoruz . Kayıplı kayan nokta sıkıştırma için yapılır.

Kelimenin tam anlamıyla her şeyi üzerinde çalışıyoruz ve 40TB'dan fazla veri saklanmış (ve kullanılıyor!). Verilerimizi gerçek zamanlı olarak kurtarmak için yeterince hızlıdır ve gereken hassasiyeti belirleyebiliriz, bu nedenle format kayıp olsa da, sonuçlarımızda herhangi bir farklılık görmüyoruz.


0

Bir işlev düzgün ise, bu işlevi temsil eden sayılar arasında çok fazla korelasyon vardır, bu nedenle veriler iyi sıkıştırılmalıdır.

Belki de ihtiyaç duyduğunuz format, değerden komşu değere kadar sadece ofsetleri kaydetmeye ihtiyaç duyar.

Alternatif olarak, belki bir ses için aynı özelliklerden bazılarını gerektirdiğinden, belki de bu değerleri "flac kayıpsız" gibi kayıpsız bir ses dosyası olarak kaydederek, frekans alanından faydalanabilirsiniz.

Ancak, yardımcı olabileceğini umduğum soruyu cevaplamaya çalışmak için farklı bir yaklaşım izleyeceğim. Söylediğiniz gibi aynı zamanda bu verileri temsil etmek için minimum açıklama uzunluğunun tüm veri noktalarını sağlamaktan daha az olduğu.

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

Etkili bir program, bilgisayar kodu, iyi bir örnektir. Ve öncelikle verilerin yürütülmesiyle çalışan ve kod olarak çalışan bir şeyin sakıncası yoksa, kayan nokta değerlerinizi bir işlev veya formül gibi bir şeye sıkıştırabilirsiniz.

Bunu özellikle iyi bir şekilde ve gerçekçi bir miktarda hesaplama yapmak zor değil. Bununla birlikte, Wolfram Dili bunu denemek için bazı işlevler sağlar:

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

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


0

Neden sadece float32 / float16 cihazını kurtarmıyorsun? Numpy,

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

Simüle ediyorsanız bunlar olmaz Kaos teorisinde Kelebek etkisini , ancak anlaşılabilir, taşınabilir, “benim için herhangi bir çalışma gerektirmez”. Ve float64 üzerinden sıkıştırma 2: 1/4: 1'i yenmek zor :)

Notlar:

"Dizi tipi float16, np.linalg dosyasında desteklenmiyor"; onu okuduktan sonra 32 ya da 64'e genişletmeniz gerekir.

Kayan nokta parametrelerinin ne kadar farklı olduğunu görmek için,

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

Şamandıra 64 32 ve 16'yı karşılaştıran önemsiz bir test durumunun grafiği için buraya bakınız .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.