3 votes

Compresser une chaîne de caractères et la stocker dans une base de données en tant que chaîne de caractères pour une décompression ultérieure.

J'ai une énorme chaîne que je dois mettre en cache quelque part et comme je ne peux pas écrire dans un fichier, ma seule option est de la stocker dans la base de données sous forme de texte. Plus précisément, dans le clob que j'ai, je stocke un fichier JSON où je place la chaîne compressée sous une certaine clé de cet objet JSON.

Je compresse les chaînes mais quelque part dans la manipulation des chaînes, il se passe quelque chose qui ne me permet pas de décompresser les données. Je me demande donc si je ne devrais pas coder les données en base 64, mais cela perdrait la compression.

Que puis-je faire pour m'assurer que je peux stocker la chaîne compressée dans la base de données afin de pouvoir la récupérer ultérieurement ?

Je ne peux pas modifier la base de données, donc je suis coincé avec ce champ CLOB.

Ce sont mes fonctions de compression :

public static String compress(String text) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        OutputStream out = new DeflaterOutputStream(baos);
        out.write(text.getBytes("UTF-8"));
        out.close();
    } catch (IOException e) {
        //ooops
    }
    return baos.toString();
}

public static String decompress(String bytes) {
    InputStream in = new InflaterInputStream(new ByteArrayInputStream(bytes.getBytes()));
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        byte[] buffer = new byte[8192];
        int len;
        while ((len = in.read(buffer)) > 0)
            baos.write(buffer, 0, len);
        return new String(baos.toByteArray(), "UTF-8");
    } catch (IOException e) {
        //ooops
    }
}

2voto

lreeder Points 4646

Comme vous l'avez constaté, vous ne pouvez pas stocker des données binaires dans un CLOB sans qu'elles soient corrompues, il faudra donc les encoder en texte.

La base 64 ajoutera, en moyenne, 33% à la taille de vos données binaires. Vous perdrez donc un peu de compression, mais si votre taux de compression est supérieur à 25 % (ce qui est souvent facile avec certains types de chaînes de texte), la compression suivie de l'encodage en base 64 peut vous apporter un gain net de stockage. L'utilisation du processeur est cependant importante.....

1voto

jtahlborn Points 32515

Vous ne pouvez pas convertir des données binaires arbitraires en String sans les casser. Comme vous l'avez déjà dit, si vous voulez stocker les données dans un clob, vous devez les encoder en base64 (ou utiliser un autre encodage binaire-texte valide).

0voto

Kayaman Points 12541

Avez-vous pensé à d'autres solutions, comme l'utilisation de memcached ou d'un autre système de mise en cache ? Ou voulez-vous vraiment jouer avec la compression ?

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