如何缓存文件句柄?

Posted

技术标签:

【中文标题】如何缓存文件句柄?【英文标题】:How to cache file handles? 【发布时间】:2013-02-12 21:47:34 【问题描述】:

我有一个应用程序想要保持打开许多文件:它会定期接收客户端请求 说“向文件 X 中添加一些数据”,理想的做法是让该文件已经打开,并且该文件的 标头部分已经解析,所以这个写入速度很快。但是,保持打开这么多文件是 对操作系统来说不是很好,如果我们的数据存储需求增长,可能会变得不可能。

所以我想要一个“给我这个文件句柄,如果它没有缓存就打开”功能,以及一些过程 用于自动关闭未写入的文件,例如五分钟。为了 缓存文件句柄的特定情况,这些文件句柄在短时间内写入,这可能就足够了, 但这似乎是一个足够普遍的问题,应该有像“给我名为 X 的对象, 如果可能的话从缓存中”和“我现在已经完成了对象 X,所以让它有资格被驱逐五 从现在开始”。

core.cache 看起来可能适合这个 目的,但 documentation 相当缺乏,而且 source 没有提供有关如何使用它的特别线索。它的 TTLCache 看起来很有前途,但同时也是 不清楚如何使用它依赖于垃圾收集来驱逐项目,所以我不能干净地关闭一个 当我准备好让资源过期时。

当然,我可以自己动手,但是有很多棘手的地方,我相信我会得到一些 事情微妙地错了,所以我希望有人可以指出我的实现 功能。我的代码在 clojure 中,但是如果使用 java 库当然会很好 这就是可以找到最佳实现的地方。

【问题讨论】:

【参考方案1】:

查看Guava's cache implementation。

您可以为get 方法提供Callable(或CacheLoader),用于“如果句柄被缓存,则返回它,否则打​​开,缓存并返回它”语义 可以配置定时驱逐如expireAfterAccess 您可以注册RemovalListener 以在删除时关闭句柄

稍微修改链接 Guava 页面中的代码示例,使用 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
    
  ;

* 免责声明 * 我自己没有这样使用缓存,请确保您对此进行明智的测试。

【讨论】:

这看起来很合适,谢谢!我唯一担心的是它看起来有可能从缓存中获取一个项目并将其挂起超过到期时间,并一直积极使用它。如果到期代码将物品撕毁,那将变得很危险。您是否知道一种从缓存中“检出对象”的方法,这样在重新检入之前不会将其拆除? 嗯,我认为这取决于。您是否会连续写入文件 >= 5 分钟?一次只能从一个请求访问缓存吗?确保您在此处查看文档:驱逐不会在到期时自动发生,而是在从/向缓存读取/写入期间自动发生。也许这很好(如果你有一个可以写很长时间的请求,那么它就不会被拆除),也许不好,因为一次有多个请求,或者你想更早/在背景... 见这里:code.google.com/p/guava-libraries/wiki/…? @amalloy,这是否意味着您真正想要的是“签入”对象的缓存,其中此缓存中的所有内容都保持打开(而不是关闭)并且您在这个池在自己建造之前先。这使得缓存独立于签入/签出。 也许试试这个:***.com/questions/17678269/…【参考方案2】:

如果您不介意一些 java,请参阅 http://ehcache.org/ 和 http://ehcache.org/apidocs/net/sf/ehcache/event/CacheEventListener.html

【讨论】:

以上是关于如何缓存文件句柄?的主要内容,如果未能解决你的问题,请参考以下文章

Excel拖动句柄自动填充给出错误值(来自缓存/内存)

文件操作

如何更改magento缓存文件存放目录?

MySQL内存使用-全局共享

chrome缓存中视频文件如何提取?

如何在 nginx 中缓存静态文件