फ्लोटिंग पॉइंट डेटा का संपीडन


26

क्या कोई उपकरण विशेष रूप से फ्लोटिंग पॉइंट वैज्ञानिक डेटा को संपीड़ित करने के लिए डिज़ाइन किया गया है?

यदि कोई फ़ंक्शन सुचारू है, तो स्पष्ट रूप से उस फ़ंक्शन का प्रतिनिधित्व करने वाली संख्याओं के बीच बहुत अधिक संबंध है, इसलिए डेटा को अच्छी तरह से संपीड़ित करना चाहिए। द्विआधारी फ़्लोटिंग पॉइंट डेटा ज़िपिंग / gzipping इसे अच्छी तरह से हालांकि संपीड़ित नहीं करता है। मुझे आश्चर्य हो रहा है कि फ्लोटिंग पॉइंट डेटा को संपीड़ित करने के लिए विशेष रूप से विकसित विधि है।

आवश्यकताएँ:

  • या तो दोषरहित संपीड़न या बनाए रखने के लिए न्यूनतम अंकों को निर्दिष्ट करने की संभावना (कुछ अनुप्रयोगों के लिए पर्याप्त से अधिक सटीक नहीं होने की doubleआवश्यकता से अधिक हो सकता है float)।

  • अच्छी तरह से काम कर रहे उपकरण का परीक्षण (यानी केवल एक सैद्धांतिक पद्धति का वर्णन करने वाला कागज नहीं)।

  • 1D संख्यात्मक डेटा (जैसे समय श्रृंखला) को संपीड़ित करने के लिए उपयुक्त

  • क्रॉस प्लेटफॉर्म (विंडोज पर काम करना होगा)

  • यह तेज़ होना चाहिए --- अधिमानतः गज़िप की तुलना में बहुत धीमा नहीं। मैंने पाया कि अगर मेरे पास ASCII के रूप में संग्रहीत संख्याएं हैं, तो फ़ाइल को जिप करने से फ़ाइल को पढ़ने और इसे संसाधित करने में तेजी आ सकती है (जैसा कि ऑपरेशन I / O बाध्य हो सकता है)।

मैं विशेष रूप से ऐसे लोगों से सुनना चाहता हूं जिन्होंने वास्तव में इस तरह के उपकरण का उपयोग किया है।


यह आंशिक रूप से FLAC के अस्तित्व से प्रेरित था , जो यह बताता है कि एक विशेष विधि को gzip से बेहतर (बहुत?) करना चाहिए।
स्ज़बोल्क्स

मैं कम से देख रहा हूँ इस अब।
स्ज़बोल्स्क

साफ। मैं इसे एक चक्कर देने जा रहा हूं।
meawoppl

जवाबों:


22

आजमाएँ Blosc । यह कई मामलों में मेमकोपी से तेज है । एक सेकंड के लिए इसके बारे में सोचिए। । । दुष्ट।

यह सुपर स्टेबल, हाई-वेट, क्रॉस-प्लेटफॉर्म है, और एक विजेता की तरह प्रदर्शन करता है।


अरे वाह, यह वास्तव में अच्छा है (और मेरे लिए नया!)
एरन अहमदिया

लिंक टूट गया है। कोई भी मौका आपको पता होगा कि वह अब कहां है?
एलेक्सिस विल्के

1
@AlexisWilke मैंने लिंक को ठीक किया। यह ब्लॉस्क के लिए एक Google खोज में पहला परिणाम था।
डग लिपिंस्की

1
ब्लॉस्क शायद तेज़ है लेकिन फ्लोट एरेज़ पर इसकी संपीड़न दर एक आपदा है। सर्वोत्तम संपीड़न के साथ यह मूल आकार के लगभग 98% परिणाम प्रदान करता है। किसी भी मामले में टिप के लिए धन्यवाद।

फ्लोट एरेज़ पर संपीड़न सामग्री पर बहुत अधिक निर्भर करता है। मुझे संदेह है कि आपके द्वारा कंप्रेस किए जाने वाले बिट्स में थोड़ी (संरचित) जानकारी है। इसके अलावा, 5 साल बाद भी ब्लाक सक्रिय देव के अधीन है!
मेवोप्लप

7

मुझे HDF5 और इसके GZIP फ़िल्टर का उपयोग करके अच्छे परिणाम मिले ।

HDF5 एक SZIP फ़िल्टर भी प्रदान करता है जो कुछ वैज्ञानिक डेटा-सेटों के लिए बेहतर परिणाम प्राप्त करता है।

मेरे अनुभव में कंप्रेशन्स का चुनाव बहुत तरह के डेटा पर निर्भर करता है और बेंचमार्किंग शायद एक अच्छा विकल्प बनाने का एकमात्र तरीका है।

BTW, HDF5 के लिए थर्ड पार्टी फिल्टर में BLOSC, BZIP2, LZO, LZF, MAFC शामिल हैं।


धन्यवाद जवाब fot! मैंने HDF5 का ज्यादा इस्तेमाल नहीं किया है। क्या यह सही है कि HDF5 फॉर्मेट के साथ gzip फ़िल्टर का उपयोग करने से मुझे एक ही कम्प्रेशन रेशियो मिलेगा जो सभी संख्याओं को एक फ्लैट बाइनरी फाइल में लिखने और इसे gzip के माध्यम से चलाने के लिए है? (अभी के लिए HDF5 का उपयोग करने की संभावित सुविधा / असुविधा को अनदेखा करें।) SZIP के बारे में, क्या यह किसी तरह से फ्लोटिंग पॉइंट डेटासेट के लिए अनुकूलित है? (मैं उत्सुक हूं और यह आपके द्वारा जुड़े पृष्ठ को स्किम करने से स्पष्ट नहीं है।) पृष्ठ कहता है कि SZIP का प्राथमिक लाभ गति है। GZIP भी बहुत तेज़ है (आमतौर पर gzip डिकंप्रेसन मेरे लिए नगण्य है)।
शैबॉलेक्स

एक gzipped फ्लैट बाइनरी फ़ाइल संभवतः gzip फ़िल्टर के साथ HDF5 फ़ाइल से छोटी होगी, क्योंकि HDF5 कच्चे डेटा से अधिक है। कभी-कभी फेरबदल फिल्टर के साथ प्रीप्रोसेसिंग से गज़िप के परिणाम में सुधार हो सकता है। लेकिन आप सही हैं, लाभ वास्तव में अधिक बल्कि सुविधा हैं। HDF5 के साथ मुझे कम्प्रेशन फ़िल्टर (विभिन्न सेटिंग्स आज़माएं) को बदलना आसान लगता है और HDF5 आपके डेटा के सबसेट (समय श्रृंखला में अंतराल) को फ़ंक्शन प्रदान करता है।
f3lix

1
यदि आप इस मार्ग पर जाते हैं तो pyTables की जांच करें । यह ऊपर कोड की सिर्फ एक दो लाइनें बनाता है। ब्लॉस्क लेखक द्वारा (पहले कम से कम) बनाए रखा।
मेवप्लप

6

[1,1]

अंतर्निहित फ़ंक्शन के आधार पर, आप डेटा को त्रुटि के बिना एक कार्यात्मक रूप में फिट करने में सक्षम हो सकते हैं, आपको डेटा बिंदु (संपीड़न के लिए अग्रणी) की तुलना में कार्यात्मक रूप का वर्णन करने के लिए कम गुणांक की आवश्यकता होती है। इन तरीकों में से कुछ के लिए त्रुटि परिणाम मौजूद हैं, हालांकि मुझे नहीं पता कि उनमें से कोई भी आपको प्राथमिकता देगा (या पोस्टवर्दी ) सीमा या त्रुटि पर अनुमान।

आप विशेष रूप से अस्थायी बिंदु संख्याओं के संपीड़न के लिए विकसित की गई विधियों को भी देख सकते हैं, जैसे एफपीसी और संबंधित एल्गोरिदम। कागजात देखें यहाँ , यहाँ , यहाँ , यहाँ , और यहाँ , पुराने स्रोत कोड वाला कोई वेब पृष्ठ के साथ यहाँ


वास्तव में मैं gzip के समान तैयार उपकरणों में रुचि रखता हूं, जिन्हें मेरे हिस्से पर किसी भी काम की आवश्यकता नहीं है, विशेष रूप से अपने स्वयं के तरीके को विकसित और ट्यूनिंग नहीं करना है। इसके अलावा, यह एक ऐसा तरीका होगा, जिसे पूरी तरह से मेमोरी में पढ़ने की आवश्यकता न हो, इसे डिकम्प्रेस करने से पहले, क्योंकि मेरे पास बहुत बड़े डेटाफाइल्स हो सकते हैं जिन्हें क्रमिक रूप से संसाधित किया जा सकता है (यह gzip के साथ काम करता है, लेकिन अगर मैं फूरियर का उपयोग नहीं करता हूं बदलना, जब तक कि मैं डेटा को अपने आप में नहीं काटता, पूरी बात को और भी जटिल करते हुए) कुछ ऐसा जो मानता है कि मेरा डेटाफाइल सिर्फ बाइनरी डबल्स की एक श्रृंखला है, उत्कृष्ट होगा।
स्ज़बोल्क्स

इसके अलावा ये 1: 1 रूपांतरण वास्तव में संपीड़न तकनीक नहीं हैं। उनका उपयोग डेटा बनाने के लिए किया जा सकता है जो एक भोली संपीड़न एल्गोरिथ्म के साथ बेहतर कर सकता है, लेकिन स्टैंडअलोन समाधान नहीं है।
मेवप्लप

इन तरीकों में से कुछ सिग्नल प्रोसेसिंग में उपयोग किए जाने वाले संपीड़न एल्गोरिदम के लिए गणितीय आधार बनाते हैं, जो उत्तर के पीछे का विचार था। ये परिवर्तन आम तौर पर विशेष परिस्थितियों में छोड़कर 1: 1 नहीं हैं।
ज्योफ ऑक्सी

3

एचडीएफ 5 एक "फेरबदल" एल्गोरिदम का उपयोग कर सकता है जहां एन फ्लोटिंग पॉइंट नंबरों के लिए बाइट्स को फिर से व्यवस्थित किया जाता है ताकि एन नंबरों के पहले बाइट्स पहले आएं, फिर 2, और इसी तरह। यह gzip लागू होने के बाद बेहतर संपीड़न अनुपात का उत्पादन करता है, क्योंकि यह समान मूल्य के लंबे दृश्यों का उत्पादन करने की अधिक संभावना है। कुछ बेंचमार्क के लिए यहां देखें ।


1

SZ (2016 में Argonne द्वारा विकसित) एक अच्छा विकल्प हो सकता है।

SZ: वैज्ञानिक अनुप्रयोगों के लिए फास्ट त्रुटि-बाउंड फ़्लोटिंग-पॉइंट डेटा कंप्रेसर https://collab.cels.anl.gov/display/ESR/SZ


आपको क्यों लगता है कि यह एक अच्छा विकल्प हो सकता है? अन्य संपीड़न तकनीकों की तुलना में इसकी क्षमताएं क्या हैं?
पॉल

1

संभव तरीके, जिनका उपयोग फ्लोटिंग-पॉइंट कम्प्रेशन के लिए किया जा सकता है:

  • फ्लोट के लिए 4xN और डबल + lz77
    कार्यान्वयन के लिए 8xN ट्रांसफ़र करें: TurboTranspose में फ़्लोटिंग पॉइंट कम्प्रेशन
    भी त्रुटि-बद्ध हानिपूर्ण संपीड़न देखें

  • प्रिडिक्टर (पूर्व परिमित संदर्भ विधि) + एन्कोडिंग (पूर्व। "पूर्णांक संपीड़न")।
    कार्यान्वयन: समय श्रृंखला के लिए विशेष संपीड़न सहित टर्बोपॉफ़र में फ्लोटिंग पॉइंट संपीड़न

  • जब संभव हो, सभी फ्लोटिंग पॉइंट नंबरों को पूर्णांक में बदल दें (उदा। 1.63 -> 163), तब पूर्णांक संपीड़न का उपयोग करें

  • आप linux और windows के लिए icapp टूल का उपयोग करके अपने डेटा के साथ इन सभी तरीकों का परीक्षण कर सकते हैं।


1

हम अपने मेडिकल इमेजिंग डेटा के लिए एचडीएफ 5 के साथ जेडएफपी का उपयोग कर रहे हैं । यह हानिपूर्ण, फ्लोटिंग पॉइंट कम्प्रेशन के लिए बनाया गया है।

हम इसे शाब्दिक रूप से सब कुछ पर चला रहे हैं, और इसमें 40TB से अधिक डेटा संग्रहीत है (और उपयोग किया जा रहा है!)। यह हमारे डेटा को वास्तविक समय बचाने के लिए पर्याप्त तेज़ है, और हम आवश्यक परिशुद्धता निर्दिष्ट कर सकते हैं, इसलिए जब प्रारूप हानिपूर्ण हो, तो हम अपने अंतिम आउटपुट में कोई अंतर नहीं देख रहे हैं।


0

यदि कोई फ़ंक्शन सुचारू है, तो स्पष्ट रूप से उस फ़ंक्शन का प्रतिनिधित्व करने वाली संख्याओं के बीच बहुत अधिक संबंध है, इसलिए डेटा को अच्छी तरह से संपीड़ित करना चाहिए।

शायद आपको जिस प्रारूप की आवश्यकता है, वह मूल्य से पड़ोसी मूल्य तक केवल स्टोर करने की आवश्यकता है।

वैकल्पिक रूप से, शायद आप फ़्रीक्वेंसी डोमेन का उपयोग कर सकते हैं, शायद इन मानों को दोषरहित ऑडियो फ़ाइल जैसे "फ्लैक लॉसलेस" के रूप में भी सहेज सकते हैं, क्योंकि आपको ध्वनि के समान कुछ गुणों की आवश्यकता होती है।

हालाँकि, मैं इस प्रश्न का उत्तर देने के प्रयास के लिए एक अलग दृष्टिकोण लेने जा रहा हूँ, जो मुझे आशा है कि कुछ मदद कर सकता है। जैसा कि आप जो कह रहे हैं वह यह भी है कि इस डेटा का प्रतिनिधित्व करने के लिए न्यूनतम विवरण लंबाई सभी डेटा बिंदु प्रदान करने से कम है।

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

प्रभावी रूप से एक प्रोग्राम, कंप्यूटर कोड, एक अच्छा उदाहरण है। और अगर आपको इस बात से ऐतराज नहीं है कि किसी चीज़ को निष्पादित करने से मुख्य रूप से डेटा काम कर रहा है, और इसलिए कोड भी हो रहा है, तो आप अपने फ़्लोटिंग पॉइंट वैल्यूज़ को किसी फ़ंक्शन या फ़ार्मुली की तरह somthing में संपीड़ित कर सकते हैं।

यह विशेष रूप से अच्छी तरह से स्वचालित रूप से करना, और गणना की एक यथार्थवादी मात्रा में, कठिन से परे है। हालाँकि वुल्फराम भाषा इसे आज़माने के लिए कुछ कार्यक्षमता प्रदान करती है:

https://reference.wolfram.com/language/ref/FindSequenceFunction.html https://reference.wolfram.com/language/ref/FindGeneratingFunction.html https://reference.wolfram.com/language-ref-FindFormula एचटीएमएल

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


0

सिर्फ फ़्लोट 32 / फ़्लोट 16 को क्यों नहीं बचाते हैं? सुन्न में,

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

यदि आप अव्यवस्था सिद्धांत में बटरफ्लाई प्रभाव का अनुकरण कर रहे हैं, तो ये नहीं करेंगे , लेकिन वे समझ में आने वाले हैं, पोर्टेबल हैं, "इस हिस्से पर किसी भी काम की आवश्यकता नहीं है"। और संपीड़न 2: 1/4: 1 ओवर फ्लोट64 को हरा करना मुश्किल है :)

टिप्पणियाँ:

"सरणी प्रकार float16 np.linalg में असमर्थित है"; आपको इसे पढ़ने के बाद इसे 32 या 64 तक विस्तारित करना होगा।

यह देखने के लिए कि फ्लोटिंग-पॉइंट पैरामीटर कैसे भिन्न होते हैं,

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

एक तुच्छ परीक्षण मामले के एक प्लॉट के लिए फ्लोट 64 32 और 16 की तुलना करें , यहां देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.