gpt4 book ai didi

java - 如何缓存文件句柄?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:59:24 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

查看 Guava's cache implementation .

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

使用 CacheLoader 稍微修改链接的 Guava 页面中的代码示例:

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
}
};

* 免责声明 * 我自己没有以这种方式使用缓存,请确保您明智地进行测试。

关于java - 如何缓存文件句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14842457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com