Die Bestimmung besten Komprimierungsalgorithmus für eine Reihe von Bytes zu verwenden

StackOverflow https://stackoverflow.com/questions/605315

  •  03-07-2019
  •  | 
  •  

Frage

Für ein persönliches Projekt von mir, ich schreibe eine kleine Klasse bis zu komprimieren und von einem eher obskuren Format zu dekomprimieren. Ich habe die volle spec bekam, aber das ist nicht, wo das Problem ist.

Zuerst Dieses ‚Format‘ verwendet einen Satz von 6 verschiedenen Komprimierungstypen sowie unkomprimierte Blöcke von Bytedaten. Die Formate sind RLE, ein Ableger von RLE wo die Zahl inkrementiert jedes Byte (zB 3, 4, 5, ...), ein 16-Bit-RLE, LZ-Kopieren, eine umgekehrte LZ-Kopie, und LZ-Copy Xor‘ d mit 255 es ist nicht das sauberste von Spezifikationen, aber ich habe es auch nicht entwerfen.

Meine Komprimierungsroutine sollte in einer Reihe von überall von 1 bis 65535 Bytes nehmen, und (hoffentlich) komprimieren, so viel wie möglich. Mein früherer Versuch, dies einfach berechnet aus einem Index in dem unkomprimierten Strom ausgehend, das der Komprimierungstechniken liefert über die beste Komprimierung, und komprimiert dann jedoch viele Bytes, die Methode mit dem Array von komprimierten Bytes komprimiert werden, bevor sie aus dem wiederkehr neuer 'unkomprimiert' Index, zum Beispiel:

{0,0,0,1,2,3,4}

Der Algorithmus zuerst lesen würde, dass es zu Beginn drei Nullen waren, und dann ausgegeben für sie die RLE-Codierung, dass der spec verwendet, und dann von dem vierten Elemente beginnen würde gelesen, dass RLE Inkrementieren abdecken würde die ‚1,2 , 3,4' gut genug und komprimieren, dass vor der Rückkehr.

Das Problem zusammengefasst ist, dass beim Versuch, die beste spec, um herauszufinden, zu verwenden, die Routine ist sehr langsam auch auf kleinen (20-30) Byte-Arrays. Kann jemand mit Tipps helfen, wie ich das bei der Optimierung aussehen könnte, oder wenn es mehr Informationen, die ich zu helfen, bieten könnte?

War es hilfreich?

Lösung

Es klingt wie das, was Sie versuchen, für jedes mögliche Segment eine große Anzahl von Kompressionsmöglichkeiten zu tun ist, erarbeiten (lassen Sie uns Ihre variable Länge 1-64K Blöcke Segmente nennen) der Datei. Korrigieren Sie mich, wenn ich falsch liege, aber arbeiten Sie die beste Kompression für das erste Segment aus folgenden Möglichkeiten aus (Methode 0 ist unkomprimiert):

  • Komprimierungsmethode 0, Länge 1 Byte.
  • Komprimierungsverfahren 1, Länge 1 Byte.
  • :::::
  • 6 Komprimierungsverfahren, Länge 1 Byte.
  • Komprimierungsmethode 0, Länge 2 Byte.
  • Komprimierungsverfahren 1, Länge 2 Byte.
  • :::::
  • 6 Komprimierungsverfahren, Länge 65534 Bytes.
  • Komprimierungsmethode 0, Länge 65535 Byte.
  • Komprimierungsverfahren 1, Länge 65535 Byte.
  • Komprimierungsverfahren 2, Länge 65535 Byte.
  • Komprimierungsverfahren 3, Länge 65535 Byte.
  • Komprimierungsverfahren 4, Länge 65535 Byte.
  • Komprimierungsverfahren 5, 65535 Bytes Länge.
  • 6 Komprimierungsverfahren, Länge 65535 Byte.

Das wird eine riesige Menge an Zeit in Anspruch nehmen (etwa 420.000 Kompressionsversuche pro Segment). Wenn das ist, was du tust, wirst du besser dran, ein einzelnes Segment Größe wählen (beispielsweise 64K) und jeder der sieben Komprimierungsverfahren, um es der Anwendung die besten zu wählen. Dann wird für jedes Segment, die Ausgabe „method“ Byte der komprimierten Daten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top