Chronicle Map Java : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course
Chronicle Map Java : méthodes, exemples, installation | PythonLib

Chronicle Map pour Java : guide complet avec exemples

Chronicle Map est une implémentation ConcurrentMap haute performance et off-heap (hors tas) pour Java, développée par Chronicle Software. Contrairement aux HashMap ou ConcurrentHashMap classiques qui stockent les données dans le tas JVM (heap), Chronicle Map place les données directement dans la mémoire vive en dehors du tas géré. Cela permet d'éviter les surcoûts liés au garbage collector (GC) et d'offrir une latence prévisible, même avec de très gros volumes de données (gigaoctets et téraoctets).

Cette bibliothèque est idéale pour les scénarios nécessitant une faible latence, un débit élevé et une gestion des données sans impact sur les pauses du GC. Ses applications typiques incluent : les systèmes financiers (plateformes de trading), la mise en cache, les systèmes temps réel, le stockage de sessions, et toute application où la performance déterministe est cruciale. Chronicle Map prend en charge l'accès multithread, la sérialisation des clés et des valeurs, et peut être configurée pour la persistance (sauvegarde des données sur disque).

Dans cet article, nous allons explorer en détail l'installation, les méthodes principales, fournir de nombreux exemples concrets et partager des conseils d'optimisation. À la fin, vous serez en mesure d'utiliser Chronicle Map en toute confiance dans vos projets Java.

1. Installation

Chronicle Map est distribué via Maven Central. Pour l'utiliser dans votre projet, ajoutez la dépendance suivante à votre fichier pom.xml (Maven) :

<dependency>
    <groupId>net.openhft</groupId>
    <artifactId>chronicle-map</artifactId>
    <version>3.25ea0</version> <!-- Vérifiez la version actuelle sur Maven Central -->
</dependency>

Si vous utilisez Gradle, ajoutez cette ligne dans votre build.gradle :

implementation 'net.openhft:chronicle-map:3.25ea0'
Note : La version 3.x est la dernière ligne stable. Pour les nouveaux projets, il est recommandé de l'utiliser. Vous pouvez vérifier la version la plus récente sur Maven Repository.

2. Démarrage rapide — exemple minimal fonctionnel

Créons une carte simple qui stocke des paires "nom d'utilisateur" (String) et "nombre de connexions" (Integer) :

import net.openhft.chronicle.map.ChronicleMap;

public class ExempleRapide {
    public static void main(String[] args) {
        try (ChronicleMap<String, Integer> carte = ChronicleMap
                .of(String.class, Integer.class)
                .name("carte-utilisateurs")
                .averageKey("utilisateur_moyen")
                .averageValue(100)
                .entries(10_000)
                .create()) {

            carte.put("alice", 42);
            carte.put("bob", 87);
            System.out.println("Connexions d'alice : " + carte.get("alice"));
            System.out.println("Taille de la carte : " + carte.size());
        }
    }
}
Astuce : Les méthodes averageKey() et averageValue() aident Chronicle Map à optimiser l'allocation mémoire. Fournissez toujours des valeurs représentatives de vos données réelles pour de meilleures performances.

3. Méthodes principales de Chronicle Map

Chronicle Map implémente l'interface ConcurrentMap et propose des méthodes supplémentaires pour un contrôle fin. Voici les plus importantes :

Méthode Description
put(K key, V value) Insère ou met à jour une paire clé-valeur.
get(K key) Récupère la valeur associée à une clé, ou null si absente.
remove(K key) Supprime l'entrée associée à la clé.
containsKey(K key) Vérifie si une clé existe dans la carte.
size() Retourne le nombre d'entrées (opération coûteuse, à utiliser avec parcimonie).
clear() Supprime toutes les entrées de la carte.
putIfAbsent(K key, V value) Insère la valeur uniquement si la clé est absente.
replace(K key, V oldValue, V newValue) Remplace la valeur uniquement si elle correspond à l'ancienne valeur spécifiée.
forEach(BiConsumer action) Applique une action à chaque entrée de la carte.
close() Libère les ressources associées à la carte (appel automatique avec try-with-resources).

4. Exemple avancé : persistance et configuration

Chronicle Map peut être configurée pour sauvegarder automatiquement les données sur disque. Voici un exemple avec persistance :

import net.openhft.chronicle.map.ChronicleMap;
import java.io.File;

public class ExemplePersistance {
    public static void main(String[] args) {
        File fichierDonnees = new File("donnees-utilisateurs.dat");

        try (ChronicleMap<String, Integer> carte = ChronicleMap
                .of(String.class, Integer.class)
                .name("carte-persistante")
                .averageKey("utilisateur_moyen")
                .averageValue(50)
                .entries(100_000)
                .createPersistedTo(fichierDonnees)) {

            carte.put("charlie", 15);
            carte.put("diana", 230);
            System.out.println("Données sauvegardées dans : " + fichierDonnees.getAbsolutePath());
        }

        // Réouverture de la carte persistée
        try (ChronicleMap<String, Integer> carteChargee = ChronicleMap
                .of(String.class, Integer.class)
                .name("carte-persistante")
                .averageKey("utilisateur_moyen")
                .averageValue(50)
                .entries(100_000)
                .createOrRecoverPersistedTo(fichierDonnees, false)) {

            System.out.println("Valeur de charlie : " + carteChargee.get("charlie"));
            System.out.println("Valeur de diana : " + carteChargee.get("diana"));
        }
    }
}
Attention : Lors de l'utilisation de la persistance, assurez-vous que les paramètres de configuration (averageKey, averageValue, entries) sont identiques entre la création et le rechargement de la carte, sous peine d'obtenir des résultats inattendus.

5. Conseils de performance

  • Préallouez correctement : Utilisez entries() pour définir le nombre maximal d'entrées attendu. Chronicle Map n'effectue pas de redimensionnement dynamique.
  • Optimisez la sérialisation : Pour les objets complexes, implémentez BytesMarshallable pour des performances de sérialisation optimales.
  • Évitez size() fréquent : Cette méthode parcourt la carte et peut être coûteuse. Utilisez-la avec parcimonie.
  • Utilisez des clés et valeurs de taille constante : Si possible, privilégiez des types de données de taille fixe (ex. long au lieu de String).
  • Testez avec vos données réelles : Les performances dépendent fortement de la distribution de vos données. Effectuez toujours des benchmarks dans votre contexte.

6. Conclusion

Chronicle Map est une solution puissante pour les applications Java nécessitant des performances déterministes et une gestion mémoire hors tas. Que vous travailliez dans le trading haute fréquence, la mise en cache distribuée ou les systèmes temps réel, cette bibliothèque vous offre un contrôle précis sur l'allocation mémoire et des latences minimales.

N'hésitez pas à consulter la documentation officielle sur GitHub pour des cas d'usage plus avancés, comme l'utilisation de clés composites ou la réplication entre instances.

Recommendations