Existe-t-il des algorithmes de réorganisation des données à optimiser pour la compression? Je comprends que cela est spécifique aux données et à l'algorithme de compression, mais y a-t-il un mot pour ce sujet? Où puis-je trouver des recherches dans ce domaine?
Plus précisément, j'ai une liste json de 1,5 million de chaînes, et je veux réorganiser les chaînes afin que la compression gzip (pour HTTP) soit optimisée. Le tri des chaînes fonctionne plutôt bien, mais je ne sais pas vraiment si c'est optimal.
Réponses:
Ceci est un ajout à la réponse de Navin Goyal.
Puisqu'un fichier JSON peut être considéré comme une structure de données d'arbre, vous pouvez utiliser la transformation XBW pour les arbres, qui est une extension de la transformation Burrows-Wheeler pour les chaînes.
la source
Burrows - Wheeler transform est un algorithme de compression bien connu qui fonctionne en réordonnant les caractères de la chaîne à compresser.
la source
Pour améliorer la compression gzip, vous souhaitez que les chaînes "similaires" soient fermées dans la liste. Il existe plusieurs façons de définir une telle similitude; permettez-moi d'en décrire une raisonnable qui fonctionne bien dans la pratique. Rappelons que la taille de bloc de gzip est de 64 Ko. Ainsi, vos données seront divisées en blocs de 64 Ko et chaque bloc sera compressé indépendamment. Pour optimiser la compression, il faudrait minimiser le nombre de k-mers distincts (sous-chaînes de taille k) dans chaque bloc. La motivation est que toutes ces sous-chaînes seront remplacées par un identifiant.
Alors que le problème ci-dessus est difficile en théorie (c'est une variante du partitionnement hypergraphique), il existe des algorithmes pratiques rapides. Je recommanderais un clustering de type LSH qui peut être implémenté en un seul passage sur vos données. Notez que le tri (alphabétique) est une autre façon de "regrouper" des chaînes similaires. Cependant, les algorithmes de clustering spécialisés peuvent mieux fonctionner.
Une alternative consiste à utiliser zstd , qui est (i) plus rapide, (ii) obtient des taux de compression plus élevés et (iii) n'a pas de limites sur la taille du bloc (et donc, comprime les chaînes également bien quel que soit l'ordre d'entrée).
la source
J'ai vu un algorithme il y a quelque temps qui peut peut-être être utile. Il utilise un algorithme d'édition de distance pour calculer la distance entre chaque mot. Ainsi, il construit un graphique dont chaque poids de bord est cette distance. Enfin, il obtient un ordre en choisissant un chemin qui a la somme de poids la plus faible. Peut-être que cela peut améliorer gzip.
la source