compression सबसे अच्छा संपीड़न एल्गोरिथ्म क्या है जो किसी फ़ाइल में यादृच्छिक पढ़ता/लिखता है?




random-access huffman-code (6)

एक शब्दकोश-आधारित संपीड़न योजना, जिसमें प्रत्येक शब्दकोश प्रविष्टि के कोड को एक ही आकार के साथ एन्कोड किया गया है, परिणामस्वरूप कोड के आकार के किसी भी कई पर पढ़ना शुरू कर सकता है, और अगर कोड अपने संदर्भ का उपयोग नहीं करते हैं तो लिखते हैं और अपडेट आसान होते हैं /पड़ोसियों।

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

सबसे अच्छा संपीड़न एल्गोरिथ्म क्या है जो किसी फ़ाइल में यादृच्छिक पढ़ता / लिखता है?

मुझे पता है कि कोई अनुकूली संपीड़न एल्गोरिदम सवाल से बाहर हो जाएगा।

और मुझे पता है कि हफ़मैन एन्कोडिंग प्रश्न से बाहर हो जाएगा

क्या किसी के पास एक बेहतर संपीड़न एल्गोरिथ्म है, जो यादृच्छिक पढ़ता / लिखता है?

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

आपके जवाबों के संदर्भ में कृपया फ़ाइल को प्रश्न में 100 जीबी मान लें, और कभी-कभी मैं पहले 10 बाइट्स पढ़ना चाहता हूं, और कभी-कभी मैं पिछले 19 बाइट्स पढ़ना चाहता हूँ, और कभी-कभी मैं 17 को पढ़ना चाहता हूँ बीच में बाइट्स ।


मैं प्रतिक्रियाओं की संख्या पर दंग रह रहा हूं जो यह दर्शाता है कि ऐसी चीज असंभव है

क्या इन लोगों को "संकुचित फाइल सिस्टम" के बारे में कभी नहीं सुना है, जो कि 1993 में स्टैक इलेक्ट्रॉनिक्स द्वारा माइक्रोसॉफ्ट पर कॉम्प्रेस्ड फाइल सिस्टम तकनीक पर मुकदमा दायर होने के बाद से लगभग चार बार हुआ था?

मैंने सुना है कि LZS और LZJB , लोगों को संकुचित फाइल सिस्टम को लागू करने के लिए लोकप्रिय एल्गोरिदम हैं, जो जरूरी यादृच्छिक अभिगम रीड और यादृच्छिक पहुँच लिखने की आवश्यकता होती है।

शायद सबसे आसान और सबसे अच्छी बात यह है कि उस फ़ाइल के लिए फ़ाइल सिस्टम संपीड़न चालू करें, और विवरण के साथ ओएस सौदा दें। लेकिन अगर आप इसे मैन्युअल रूप से निपटने पर जोर देते हैं, तो शायद आप NTFS पारदर्शी फ़ाइल संपीड़न के बारे में पढ़ कर कुछ युक्तियां चुन सकते हैं।

यह भी देखें: "स्टैक ओवरफ्लो: अभिलेखागार के भीतर रैंडम एक्सेस के लिए अच्छा समर्थन के साथ संपीड़न प्रारूप?"


मुझे लगता है स्टीफन डेन यहाँ कुछ पर हो सकता है। कल्पना कीजिए:

  • कोड के लिए दृश्यों की ज़िप-जैसी संपीड़न
  • एक शब्दकोश मैपिंग कोड -> अनुक्रम
  • फ़ाइल एक फाइल सिस्टम की तरह होगी
    • प्रत्येक लेखन एक नया "फ़ाइल" (बाइट्स का अनुक्रम, शब्दकोश के अनुसार संकुचित) उत्पन्न करता है
    • "फाइलसिस्टम" का ट्रैक रखता है जिसमें "फ़ाइल" का संबंध है जो बाइट्स (प्रारंभ, अंत)
    • प्रत्येक "फ़ाइल" को शब्दकोश के अनुसार संकुचित किया गया है
    • "फाइलसिस्टम" के अनुसार काम की गई फाइलवार, असम्पीडिंग और बाइट्स को पुनः प्राप्त करता है
    • लिखता है "फाइलें" अमान्य, नई "फाइल" को अवैध रूप से बदलने के लिए जोड़ा जाता है
  • इस प्रणाली की आवश्यकता होगी:
    • फाइल सिस्टम के डीफ़्रेग्मेंटेशन तंत्र
    • कॉम्पैक्टिंग डिक्शनरी समय-समय पर (अप्रयुक्त कोड निकालकर)
  • ठीक से किया गया, गृहकुछ किया जा सकता है जब कोई भी (निष्क्रिय समय) नहीं देख रहा हो या एक नई फ़ाइल बनाकर और अंततः "स्विचिंग" कर सकता है

एक सकारात्मक प्रभाव होगा कि शब्दकोश पूरी फाइल पर लागू होगा यदि आप CPU चक्र को छोड़ सकते हैं, तो आप समय-समय पर "फ़ाइल" सीमाओं को ओवरलैप करने वाले दृश्यों की जांच कर सकते हैं और फिर उन्हें पुन: संयोजन कर सकते हैं।

यह विचार वाकई यादृच्छिक पढ़ता है। यदि आप केवल निश्चित आकार के रिकॉर्ड पढ़ने जा रहे हैं, तो इस विचार के कुछ भाग आसानी से मिल सकते हैं।


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

जैसे
हम केवल पढ़ने के लिए पहले मामले को देखेंगे। मान लीजिए कि आप अपनी फाइल को 8 के खंड में तोड़ सकते हैं। आप प्रत्येक टुकड़ा को संकुचित करते हैं और प्रत्येक संकुचित खंड को क्रमिक रूप से संग्रहीत करते हैं आपको यह रिकॉर्ड करने की आवश्यकता होगी कि प्रत्येक संकुचित हिस्सा किस स्थान पर है और यह कितना बड़ा है। उसके बाद, आपको ऑफसेट हे में शुरू होने वाले एन बाइट्स को पढ़ने की आवश्यकता है। आपको यह पता होना चाहिए कि यह कौन सा हिस्सा है (ओ / 8 के), उस हिस्से को दबा देना और उन बाइट्स को पकड़ना। आपके द्वारा आवश्यक डेटा में एकाधिक खंड हो सकते हैं, इसलिए आपको उस परिदृश्य से निपटना होगा

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

यह मूल रूप से संकुचित फ़ाइल सिस्टम कैसे काम करता है आप अपनी फाइलों के लिए फ़ाइल सिस्टम कम्प्रेशन को चालू करने से बेहतर हो सकते हैं और सामान्य रूप से उन्हें लिखकर / लिखें


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

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

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

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


Razip प्रारूप का समर्थन करता है यादृच्छिक अभिगम gzip / bzip2 की तुलना में बेहतर प्रदर्शन के साथ करता है जिसे इस समर्थन के लिए छेड़ा जाना चाहिए:

http://sourceforge.net/projects/razip/