Zum Inhalt springen

Progressive Kompression

aus Wikipedia, der freien Enzyklopädie

Progressive Kompression, auch kompakte Kompression oder solide Kompression ({{#invoke:Vorlage:lang|full|CODE=en|SCRIPTING=Latn|SERVICE=englisch}}), ist ein Verfahren bzw. ein Vorverarbeitungsschritt bei der Kompression mehrerer Dateien. Die Dateien werden dabei zu einem oder auch mehreren großen Blöcken zusammengefasst und dann dateiübergreifend komprimiert. Auf diese Weise erzielt man meist eine höhere Kompression, als wenn jede Datei einzeln komprimiert wird. Wie groß dieser Vorteil ist, hängt davon ab, wie ähnlich die Dateien sind.

Funktion

Solide Kompression kann immer dann eingesetzt werden, wenn mehrere Dateien in einem Archiv zusammengefasst werden. Kommt solide Kompression zum Einsatz, dann werden alle Dateien vor der eigentlichen Kompression zusammengefasst und dann als einzelner kontinuierlicher Datenstrom komprimiert. Andernfalls, d. h. ohne solide Kompression, werden die einzelnen Dateien zunächst unabhängig voneinander komprimiert und erst nach der eigentlichen Kompression zu einer Archivdatei zusammengefasst. Üblicherweise verbessert progressive Komprimierung die Kompressionsrate – besonders bei vielen kleineren und ähnlichen Dateien (wie etwa Logdateien). Dies ist darauf zurückzuführen, dass bei der soliden Kompression auch Redundanzen zwischen verschiedenen Dateien zur Datenreduktion ausgenutzt werden können, wohingegen ohne solide Kompression nur Redundanzen innerhalb der jeweiligen Datei ausgenutzt werden können.

Manche Archivierungsprogramme (z. B. RAR) sortieren die Dateien vorher nach Dateityp, um so die Kompressionsrate noch etwas mehr zu verbessern.<ref name="schmidt_devlib_org"><templatestyles src="Webarchiv/styles.css" />{{#if:20070427142110

      | {{#ifeq: 20070427142110 | *
    | Vorlage:Webarchiv/Wartung/Stern{{#if: Archive file formats and archivers „Solid archives“ | {{#invoke:WLink|getEscapedTitle|Archive file formats and archivers „Solid archives“}} | {{#invoke:Webarchiv|getdomain|http://schmidt.devlib.org/file-formats/archive-file-formats.html}} }} (Archivversionen)
    | {{#iferror: {{#time: j. F Y|20070427142110}}
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/DatumDer Wert des Parameters {{#if: wayback | wayback | Datum }} muss ein gültiger Zeitstempel der Form YYYYMMDDHHMMSS sein!
         | {{#if: Archive file formats and archivers „Solid archives“ | {{#invoke:WLink|getEscapedTitle|Archive file formats and archivers „Solid archives“}} | {{#invoke:Webarchiv|getdomain|http://schmidt.devlib.org/file-formats/archive-file-formats.html}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer }} vom {{#time: j. F Y|20070427142110}} im Internet Archive{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
      }}
  }}
      | {{#if:
          | {{#iferror: {{#time: j. F Y|{{{webciteID}}}}}
    | {{#switch: {{#invoke:Str|len|{{{webciteID}}}}}
       | 16= {{#if: Archive file formats and archivers „Solid archives“ | {{#invoke:WLink|getEscapedTitle|Archive file formats and archivers „Solid archives“}} | {{#invoke:Webarchiv|getdomain|http://schmidt.devlib.org/file-formats/archive-file-formats.html}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer }} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{{webciteID}}}|1|10}}/86400}} }} days}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
       | 9 = {{#if: Archive file formats and archivers „Solid archives“ | {{#invoke:WLink|getEscapedTitle|Archive file formats and archivers „Solid archives“}} | {{#invoke:Webarchiv|getdomain|http://schmidt.devlib.org/file-formats/archive-file-formats.html}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer}} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{#invoke:Expr|base62|{{{webciteID}}}}}|1|10}}/86400}} }} days}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
       | #default= Der Wert des Parameters {{#if: webciteID | webciteID | ID }} muss entweder ein Zeitstempel der Form YYYYMMDDHHMMSS oder ein Schüsselwert mit 9 Zeichen oder eine 16-stellige Zahl sein!Vorlage:Webarchiv/Wartung/webcitation{{#if:  || }}
      }}
    | c|{{{webciteID}}}}} {{#if: Archive file formats and archivers „Solid archives“ | {{#invoke:WLink|getEscapedTitle|Archive file formats and archivers „Solid archives“}} | {{#invoke:Webarchiv|getdomain|http://schmidt.devlib.org/file-formats/archive-file-formats.html}} }} (Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer}} vom {{#time: j. F Y|{{{webciteID}}}}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
  }}
          | {{#if: 
              | Vorlage:Webarchiv/Today
              | {{#if:
                      | Vorlage:Webarchiv/Generisch
                      | {{#if: Archive file formats and archivers „Solid archives“ | {{#invoke:WLink|getEscapedTitle|Archive file formats and archivers „Solid archives“}} | {{#invoke:Webarchiv|getdomain|http://schmidt.devlib.org/file-formats/archive-file-formats.html}} }}  
                 }}}}}}}}{{#if:
    | Vorlage:Webarchiv/archiv-bot
  }}{{#invoke:TemplatePar|check
     |all      = url=
     |opt      = text= wayback= webciteID= archive-is= archive-today= archiv-url= archiv-datum= ()= archiv-bot= format= original=
     |cat      = Wikipedia:Vorlagenfehler/Vorlage:Webarchiv
     |errNS    = 0
     |template = Vorlage:Webarchiv
     |format   = *
     |preview  = 1
  }}{{#ifexpr: {{#if:20070427142110|1|0}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}} <> 1
    | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Genau einer der Parameter 'wayback', 'webciteID', 'archive-today', 'archive-is' oder 'archiv-url' muss angegeben werden.|1}}
  }}{{#if: 
    | {{#switch: {{#invoke:Webarchiv|getdomain|{{{archiv-url}}}}}
        | web.archive.org = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von Internet Archive erkannt, bitte Parameter 'wayback' benutzen.|1}} 
        | webcitation.org = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von WebCite erkannt, bitte Parameter 'webciteID' benutzen.|1}} 
        | archive.today |archive.is |archive.ph |archive.fo |archive.li |archive.md |archive.vn = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von archive.today erkannt, bitte Parameter 'archive-today' benutzen.|1}}
      }}{{#if: 
         | {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}
             | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Wert des Parameter 'archiv-datum' ist ungültig oder hat ein ungültiges Format.|1}}
          |  }} 
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Pflichtparameter 'archiv-datum' wurde nicht angegeben.|1}}
      }}
    | {{#if: 
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Parameter 'archiv-datum' ist nur in Verbindung mit 'archiv-url' angebbar.|1}}
      }}
  }}{{#if:{{#invoke:URLutil|isHostPathResource|http://schmidt.devlib.org/file-formats/archive-file-formats.html}}
    || {{#if:  || }}
  }}{{#if: Archive file formats and archivers „Solid archives“
    | {{#if: {{#invoke:WLink|isBracketedLink|Archive file formats and archivers „Solid archives“}}
        | {{#if:  || }}
      }}
    | {{#if:  || }}Vorlage:Webarchiv/Wartung/Linktext_fehlt
  }}{{#switch: 
    |addlarchives|addlpages= {{#if:  || }}{{#if: 1 |Vorlage:Webarchiv/Wartung/Parameter}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: enWP-Wert im Parameter 'format'.|1}}
  }}{{#ifeq: {{#invoke:Str|find|http://schmidt.devlib.org/file-formats/archive-file-formats.html%7Carchiv}} |-1
    || {{#ifeq: {{#invoke:Str|find|{{#invoke:Str|cropleft|http://schmidt.devlib.org/file-formats/archive-file-formats.html%7C4}}%7Chttp}} |-1
         || {{#switch: {{#invoke:Webarchiv|getdomain|http://schmidt.devlib.org/file-formats/archive-file-formats.html }}
              | abendblatt.de | daserste.ndr.de | inarchive.com | webcitation.org = 
              | #default = {{#if:  || }}{{#if: 1 |Vorlage:Webarchiv/Wartung/URL}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Archiv-URL im Parameter 'url' anstatt URL der Originalquelle. Entferne den vor der Original-URL stehenden Mementobestandteil und setze den Archivierungszeitstempel in den Parameter 'wayback', 'webciteID', 'archive.today' oder 'archive-is' ein, sofern nicht bereits befüllt.|1}}
            }} 
       }}
  }} bei schmidt.devlib.org (englisch)</ref>
Datei:Solid compression1de.png
Archivierung ohne (oben) und mit (unten) solider Kompression – schematische Darstellung

Technische Erklärung

Moderne Packprogramme verwenden eine Kombination aus Wörterbuchkompression (z. B. LZ77) und Entropiekodierung (z. B. Huffman-Kodierung), wie dies u. a. beim Deflate-Algorithmus der Fall ist.

Ziel der Wörterbuchkompression ist es mehrfach vorkommende Byte-Folgen zu ersetzen, so dass diese nur einmal gespeichert werden müssen. Das dabei verwendete Wörterbuch (auch Lexikon) wird heute i. a. R. sukzessive während des Kompressions- bzw. Dekompressionsvorgangs aufgebaut (ausgehend von einem initialen, leeren Wörterbuch), damit das Wörterbuch nicht separat übertragen bzw. gespeichert werden muss. Übertragen werden ausschließlich Literale, also Byte-Folgen, die noch nicht im Wörterbuch enthalten sind, oder Referenzen auf bereits vorhandene Wörterbuch-Einträge. Alle übertragenen Literale werden sogleich dem Wörterbuch hinzugefügt – sowohl vom Kodierer als auch vom Dekodierer. Dies führt zu einer „Aufwärmphase“ am Beginn des Kompressionsvorganges, in der das Wörterbuch zunächst befüllt werden muss, bevor tatsächlich Daten durch Wörterbuch-Referenzen eingespart werden können (vgl. z. B. LZ77 und LZ78).

Ohne solide Kompression können nur Redundanzen innerhalb der jeweiligen Datei entfernt werden. Redundanzen zwischen mehreren Dateien bleiben unberücksichtigt, da bei jeder Datei wieder mit einem leeren Wörterbuch begonnen wird. Auch durch die jedes Mal neue „Aufwärmphase“ leidet die Kompression etwas. Bei der soliden Kompression hingegen kann durchgängig dasselbe Wörterbuch für alle Dateien verwendet werden. Dies ist insbesondere bei Dateien mit ähnlichem Inhalt von großem Vorteil. Bei kleinen Dateien ist dieser Vorteil umso stärker ausgeprägt, da hier die „Aufwärmphase“ einen größeren Anteil hat.

Die obigen Überlegungen gelten in ähnlicher Form auch für die adaptiven Kontextmodelle, die bei der Entropiekodierung verwendet werden (vgl. PPMD oder LZMA).

Nachteile

Da ein solides Archiv nur aus einem Datenstrom besteht, der fortlaufend komprimiert wurde, ist ein wahlfreier Zugriff auf einzelne Dateien nicht möglich. Das bedeutet, dass beim Entpacken einer bestimmten Datei erst alle Dateien, die sich im Archiv vor dieser Datei befinden, entpackt werden müssen. Dies geschieht meist nur im Arbeitsspeicher, da lediglich ein Teil der Daten später zur Dekompression der gewünschten Datei benötigt wird und der Rest wieder verworfen werden kann.<ref name="schmidt_devlib_org" /> Bei einer Beschädigung des Archivs kann sich dadurch ein Fehler auch weiter über die betroffene Datei hinaus erstrecken. Wie weit, hängt von der Höhe der Kompressionsrate ab, kann aber bis hin zum Verlust aller Daten ab der Fehlerposition führen. Daher eignet es sich, jedes komprimierte Archiv mindestens doppelt zu speichern, damit Schäden durch Sektorenfehler durch Ergänzung in einem Byte-Editor behoben werden können.

Weitere Dateien können nur an das Ende des Archivs hinzugefügt werden.

Das Löschen von Dateien aus der Archivdatei ist nur möglich, indem der Datenstrom vollständig dekomprimiert wird, die zu löschenden Dateien entfernt werden und anschließend die Dateien wieder solide komprimiert werden.

Um nicht jedes Mal das komplette Archiv entpacken zu müssen, kann als Kompromisslösung auch die Länge zusammenhängend komprimierter Daten begrenzt und dadurch unabhängig komprimierte Blöcke erstellt werden.

Verwendung

Progressive Kompression wird unter anderem von den Archiv-Formaten 7z, RAR, ACE sowie ARC unterstützt.

In Unix-Umgebungen werden traditionell separate Werkzeuge zur Archivierung und zur Kompression verwendet (vgl. Unix-Philosophie). Üblicherweise werden zunächst alle Dateien mit dem Werkzeug tar zu einem (unkomprimierten) Archiv zusammengefasst, welches im Anschluss komprimiert werden kann. Zur Kompression kann z. B. gzip (ergibt .tar.gz), bzip2 (ergibt .tar.bz2) oder xz (ergibt .tar.xz) eingesetzt werden. Dieses Vorgehen entspricht einer progressiven Kompression.

Das verbreitete ZIP-Dateiformat hingegen unterstützt die progressive Archivierung nicht. Durch die Verwendung zweier geschachtelter ZIP-Archive kann jedoch eine progressive Kompression erreicht werden. Dazu fasst man zunächst alle Einzeldateien mit kompressionsloser ZIP-Archivierung zusammen. Anschließend komprimiert man diese ZIP-Datei mit der gewünschten Kompressionsstufe.

Einzelnachweise

<references />