6个版本
0.1.3 | 2021年12月12日 |
---|---|
0.1.2 | 2021年11月7日 |
0.0.3 | 2021年10月24日 |
#345 in 缓存
用于 synthizer
37KB
646 代码行
asset_lru
有时候你想从磁盘或其他昂贵的位置缓存资源。有时候这些资源作为压缩/编码的字节要小得多。这个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