#cache #lru-cache #disk #object #byte #vfs #assets

asset_lru

内存中比磁盘上更大的对象的二级缓存

6个版本

0.1.3 2021年12月12日
0.1.2 2021年11月7日
0.0.3 2021年10月24日

#345 in 缓存


用于 synthizer

BSL-1.0 许可证

37KB
646 代码行

asset_lru

Actions

文档

有时候你想从磁盘或其他昂贵的位置缓存资源。有时候这些资源作为压缩/编码的字节要小得多。这个crate为这种情况下提供了一种相对智能的策略,其中编码的字节不仅缓存在内存中,还缓存在解码的对象中。

这是一个非常新的crate,但通过单元测试具有良好的代码覆盖率。


lib.rs:

一组LRU缓存机制,适用于少量大型对象。

有时,你可能在磁盘上有一个压缩的JSON文件,或者可能是一个损失性的音频文件,其大小是解压缩/解码表示的10倍或更大。从磁盘读取这些并重复进行解码过程是昂贵的,但另一方面,简单的键到缓存值的映射将无限增长,并且不是很智能,因为它无法优化我们有足够的内存来保留从磁盘读取的字节的情况。这个crate通过两种类型和一些特质提供了解决这个问题的方案

[CostBasedLru]是一个支持为每个项目指定成本的标准的LRU缓存。当成本超过时,缓存将驱逐,直到成本低于阈值。这是基本低级构建块,因为它在其它上下文中很有用而被公开。这是最简单的一块:你只需向它扔项目。

更高级的部分是[AssetCache],它返回从[Vfs]读取的解码项的Arc包装,具有复杂的缓存策略

  • 首先,如果从磁盘读取的对象小于可配置的阈值,我们可以在[CostBasedLru]中缓存我们从磁盘读取的字节,并在必要时从后端的LRU中驱逐。
  • 其次,如果对象的尺寸小于可配置的阈值,我们可以以相同的方式缓存解码对象。
  • 之后,如果我们根本不缓存对象,我们可以将其保留为弱引用,以便只要外部这个crate的某个东西保持其活跃状态,我们就可以返回相同的对象。
  • 最后,对于非常重要的项目,你可以调用cache_always来完全绕过机制,并在会计机制之外永久保留它们。

要使用此crate,请实现[Vfs]和[Decoder]特质,然后使用您选择的[AssetCacheConfig]构建一个[AssetCache]。对于使用文件系统目录的简单用法,请使用[FilesystemVfs],这会为您完成这些操作。

std::sync::Arc提供了一个[Vfs]的泛型实现,这样任何指向Vfs的Arc本身就是一个Vfs。这允许在缓存或其他可能需要它的任何东西之间共享Vfs。

依赖项

~2.5MB
~52K SLoC