Gibt es Algorithmen zum Neuordnen von Daten, um die Komprimierung zu optimieren? Ich verstehe, dass dies spezifisch für die Daten und den Komprimierungsalgorithmus ist, aber gibt es ein Wort für dieses Thema? Wo kann ich in diesem Bereich recherchieren?
Insbesondere habe ich eine JSON-Liste mit 1,5 Millionen Zeichenfolgen, und ich möchte die Zeichenfolgen neu anordnen, damit die GZIP-Komprimierung (für HTTP) optimiert wird. Das Sortieren der Zeichenfolgen funktioniert ziemlich gut, aber ich weiß nicht wirklich, ob das optimal ist.
optimization
permutations
Jayen
quelle
quelle
Antworten:
Dies ist eine Ergänzung zur Antwort von Navin Goyal.
Da eine JSON-Datei als Baumdatenstruktur betrachtet werden kann, können Sie die XBW-Transformation für Bäume verwenden, eine Erweiterung der Burrows-Wheeler-Transformation für Zeichenfolgen.
quelle
Burrows - Wheeler-Transformation ist ein bekannter Komprimierungsalgorithmus, bei dem die Zeichen in der zu komprimierenden Zeichenfolge neu angeordnet werden.
quelle
Um die gzip-Komprimierung zu verbessern, möchten Sie, dass "ähnliche" Zeichenfolgen in der Liste angezeigt werden. Es gibt eine Reihe von Möglichkeiten, eine solche Ähnlichkeit zu definieren. Lassen Sie mich ein vernünftiges beschreiben, das in der Praxis gut funktioniert. Denken Sie daran, dass die Blockgröße von gzip 64 KB beträgt. Somit werden Ihre Daten in Blöcke von 64 KB aufgeteilt und jeder Block wird unabhängig komprimiert. Um die Komprimierung zu optimieren, müsste man die Anzahl der unterschiedlichen k-mere (Teilzeichenfolgen der Größe k) in jedem Block minimieren. Die Motivation ist, dass alle diese Teilzeichenfolgen durch einen Bezeichner ersetzt werden.
Während das obige Problem theoretisch schwierig ist (es ist eine Variante der Hypergraph-Partitionierung), existieren schnelle praktische Algorithmen. Ich würde LSH-ähnliches Clustering empfehlen , das mit einem einzigen Durchlauf über Ihre Daten implementiert werden kann. Beachten Sie, dass (alphabetische) Sortierung eine andere Möglichkeit ist, ähnliche Zeichenfolgen zu "gruppieren". Spezielle Clustering-Algorithmen können jedoch eine bessere Leistung erbringen.
Eine Alternative ist die Verwendung von zstd , das (i) schneller ist, (ii) höhere Komprimierungsverhältnisse erzielt und (iii) die Blockgröße nicht einschränkt (und daher Zeichenfolgen unabhängig von der Eingabereihenfolge gleich gut komprimiert).
quelle
Ich habe vor einiger Zeit einen Algorithmus gesehen, der vielleicht nützlich sein kann. Es verwendet einen Algorithmus zum Bearbeiten der Entfernung, um die Entfernung zwischen den einzelnen Wörtern zu berechnen. Auf diese Weise wird ein Diagramm erstellt, in dem jedes Kantengewicht diesem Abstand entspricht. Schließlich erhält es eine Anweisung, einen Pfad auszuwählen, der die niedrigste Summe von Gewichten aufweist. Vielleicht kann es gzip verbessern.
quelle