39 votes

Implementer la compression en mémoire pour les objets en Java

Nous avons ce cas d'utilisation où nous aimerions compresser et stocker des objets (en mémoire) et les décompresser au besoin.

Les données que nous voulons compresser sont assez variées, allant de vecteurs de flottants à des chaînes de caractères en passant par des dates.

Est-ce que quelqu'un pourrait suggérer une bonne technique de compression pour cela ?

Nous recherchons la facilité de compression et la vitesse de décompression comme facteurs les plus importants.

Merci.

2voto

Stephen C Points 255558

C'est un problème délicat :

Tout d'abord, utiliser ObjectOutputStream n'est probablement pas la réponse. Le format du flux inclut beaucoup de métadonnées liées au type. Si vous sérialisez de petits objets, les métadonnées obligatoires rendront difficile pour l'algorithme de compression de "s'équilibrer", même si vous implémentez des méthodes de sérialisation personnalisées.

Utiliser DataOutputStream avec un minimum (ou pas du tout) d'informations de type supplémentaires donnera de meilleurs résultats, mais les données mixtes ne sont généralement pas compressibles de manière efficace en utilisant des algorithmes de compression généraux.

Pour une meilleure compression, vous devrez peut-être examiner les propriétés des données que vous compressez. Par exemple :

  • Les objets de type Date pourraient être représentés en tant que valeurs int si vous savez qu'ils ont une précision d'1 jour.
  • Les séquences de valeurs de type int pourraient être codées en longueurs de course, ou codées en delta si elles ont les bonnes propriétés.
  • et ainsi de suite.

Quelle que soit la manière dont vous le faites, vous devrez fournir un effort sérieux pour obtenir une quantité significative de compression. À mon avis, une meilleure idée serait d'écrire les objets dans une base de données, un magasin de données ou un fichier et d'utiliser un système de cache pour conserver en mémoire les objets utilisés fréquemment.

2voto

AlexR Points 60796

La meilleure technologie de compression que je connaisse est ZIP. Java prend en charge ZipStream. Tout ce dont vous avez besoin est de sérialiser votre objet en un tableau d'octets, puis de le compresser.

Astuces : utilisez ByteArrayOutputStream, DataStream, ZipOutputStream.

1voto

Aasmund Eldhuset Points 17036

Si vous avez besoin de compresser des objets arbitraires, une approche possible consiste à sérialiser l'objet dans un tableau d'octets, puis à utiliser par exemple l'algorithme DEFLATE (celui utilisé par GZIP) pour le compresser. Lorsque vous avez besoin de l'objet, vous pouvez le décompresser et le désérialiser. Je ne suis pas sûr de son efficacité, mais cela sera complètement général.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X