13 votes

Comment mettre en cache les poignées de fichiers ?

J'ai une application qui veut garder ouverts de nombreux fichiers : périodiquement, elle reçoit une demande du client disant "ajouter des données au fichier". disant "ajoutez des données au fichier X", et l'idéal serait d'avoir ce fichier déjà ouvert, et la section d'en-tête du fichier déjà analysée, de sorte que cette requête puisse être envoyée au client. du fichier déjà analysée, afin que cette écriture soit rapide. Cependant, garder ouvert autant de fichiers est pas très agréable pour le système d'exploitation, et pourrait devenir impossible si nos besoins en stockage de données augmentent.

J'aimerais donc une fonction "donnez-moi le handle de ce fichier, en l'ouvrant s'il n'est pas en cache", et un processus quelconque pour fermer automatiquement les fichiers qui n'ont pas été écrits pendant, disons, cinq minutes. Pour le cas spécifique de la mise en cache de handles de fichiers sur lesquels on écrit par à-coups, c'est probablement suffisant, mais cela semble être un problème suffisamment général pour qu'il y ait des fonctions du type "donnez-moi l'objet nommé X", à partir du cache si possible" et "J'en ai maintenant fini avec l'objet X, alors rendez-le éligible à l'éviction dans cinq minutes". minutes à partir de maintenant".

core.cache il semble qu'il pourrait convenir pour cela but, mais le documentation fait défaut et le fuente ne fournit aucun indice particulier sur la manière de l'utiliser. Son TTLCache semble prometteur, mais en plus de ne pas être pas clair sur la manière de l'utiliser, il s'appuie sur le garbage collection pour expulser les éléments, donc je ne peux pas fermer proprement un ressource lorsque je suis prêt à l'expirer.

Je pourrais rouler le mien, bien sûr, mais il y a un certain nombre d'endroits délicats et je suis sûr que j'obtiendrais quelques choses subtilement fausses, alors j'espère que quelqu'un pourra m'indiquer une implémentation de cette fonctionnalité. fonctionnalité. Mon code est en clojure, mais bien sûr l'utilisation d'une bibliothèque java serait tout à fait bien si si c'est là que l'on trouve la meilleure implémentation.

6voto

Jens Hoffmann Points 1468

Vérifiez L'implémentation du cache de Guava .

  • Vous pouvez fournir un Callable (ou un CacheLoader ) à la get méthode pour "si le handle est en cache, le retourner, sinon l'ouvrir, le mettre en cache et le retourner" sémantique
  • Vous pouvez configurer une éviction temporisée telle que expireAfterAccess
  • Vous pouvez enregistrer un RemovalListener pour fermer les poignées lors du retrait

Modifiant légèrement les exemples de code de la page Guava liée, en utilisant CacheLoader :

LoadingCache<Key, Handle> graphs = CacheBuilder.newBuilder()
   .maximumSize(100) // sensible value for open handles?
   .expireAfterAccess(5, TimeUnit.MINUTES)
   .removalListener(removalListener)
   .build(
       new CacheLoader<Key, Handle>() {
         public Handle load(Key key) throws AnyException {
           return openHandle(key);
         }
       });

RemovalListener<Key, Handle> removalListener = 
  new RemovalListener<Key, Handle>() {
    public void onRemoval(RemovalNotification<Key, Handle> removal) {
      Handle h = removal.getValue();
      h.close(); // tear down properly
    }
  };

* DISCLAIMER * Je n'ai pas utilisé moi-même le cache de cette manière, assurez-vous de tester cela de manière raisonnable.

1voto

dAni Points 4032

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