6
votes

Stockage de chaîne comprimé

permet de dire que j'ai de nombreux objets contenant des chaînes de longueur non triviale (environ 3-4kb). Les chaînes sont toutes différentes les unes des autres mais contiennent en même temps beaucoup de parties communes / de suivantes. En moyenne, peut-être 80-90% de toute chaîne individuelle est également contenue avec les autres. Existe-t-il un moyen facile d'exploiter automatiquement cette énorme redondance pour compresser les données?
Idéalement, la solution serait C ++ et transparente pour l'utilisateur (c'est-à-dire que je peux l'utiliser comme si j'étais accessible à une lecture régulière Const std STD :: String, mais à la lecture d'un stockage compressé).


4 commentaires

Comment les chaînes viennent-elles avoir des sous-séquences communes? Est-ce dû à des modifications répétées ou de coïncidence des données?


Imaginez HTML statique sans support pour CSS. Vous avez beaucoup de HTML redondant et seulement très peu de pièces modifiées contenant les informations réelles.


1 Go de RAM tiendra de l'ordre de 100 000 blobs non compressés de 3 à 4 Ko. Avez-vous vraiment besoin de cela pour s'adapter à moins?


Ouais. Je traite avec> = 500.000 et cela ne fait qu'une partie des données (dans une application 32 bits ...).


4 Réponses :



2
votes

Si les parties communes des chaînes sont courantes car elles sont composées d'autres cordes, vous pourriez obtenir une certaine traction en utilisant le stlport corde classe, qui cherche tout le monde comme une STD :: String, mais utilise la représentation de l'arborescence de sous-chaîne avec une copie sur l'écriture qui les rend tous les deux très Espace efficace (des substrings communes sont partagés) et très bien à des insertions et de suppression (log (n))

Quand utiliser la corde:

  • Vous faites un moteur de modèle. Les instances de documents sont fabriquées à partir d'un modèle en substituant des données variables dans le modèle, puis mis en cache pour des utilisations futures. Les pièces communes aux modèles et aux instances ne sont stockées qu'une fois et partagées sur des instances, des inserts et des suppresses sont bon marché.

    Quand ne pas utiliser de corde:

    • Vous chargez de nombreux documents de l'extérieur du domaine de votre application (à partir de disque ou sur un réseau) et utilisez-les sans modification. La corde ne partage pas les chaînes s'ils ne sont pas copiés d'une corde à une autre. Si vous pouvez vous permettre de faire le travail pour trouver les sous-chaînes communes, la corde peut toujours être utilisée pour améliorer vos représentations finales.

3 commentaires

Je pense que cela a plus que la copie sur l'écriture. Je pense que les données sont stockées dans un arbre de chaînes, pas dans une zone de mémoire contiguë.


Il s'agit d'une copie-écriture combinée à une capacité à préparer aux chaînes au même coût algorithmique que l'adjuvant.


Je pense que je suis adapté à votre deuxième cas: mes cordes ne sont pas contrôlées par moi et je les reçois d'une base de données.



3
votes

Vous pouvez utiliser codage Huffman La mise en œuvre n'est pas difficile, il existe également des algorithmes zip dans les langues ( comme c # et java) et vous pouvez les utiliser.

Également si vous êtes sûr de 80-90%, créez un dictionnaire de tous les mots, puis pour chaque chaîne Stocker la position du mot dictionnaire, des moyens ont un tableau de grandes taille (10000 c'est-à-dire) et marquez la connexion position bits [i] à 1 Si un mots [i] existe dans la chaîne actuelle. Pensez que chaque longueur de mot est de 5 caractères, l'abréviation prend environ 1/5.


0 commentaires

1
votes

Comme @saeed mentionné, un simple codage de Huffman fonctionnera bien ici.

Il n'y a pas besoin dans le dictionnaire, si les mots communs sont connus Apriori (vous avez mentionné que c'est un HTML). Il suffit de précomputer une table Huffman à l'aide de données statistiques à partir de nombreux fichiers HTML (notez que vous pouvez encoder une balise entière par un seul symbole et vous pouvez avoir autant de symboles que vous le souhaitez).


0 commentaires