#cache #memory-mapped #low-level #offset #mmap #byte-offset #key

mmap-cache

一个低级的只读内存映射缓存

1 个不稳定版本

0.1.0 2022年5月7日

#271缓存

MIT/Apache

25KB
392

mmap-cache

一个用于只读键值存储内存映射缓存的低级API。

设计

Cache索引是一个fst::Map,它将任意字节序列映射到[u64]。我们使用[u64]作为存储任意值内存映射文件的字节偏移。这个只读缓存非常紧凑且易于构建,只需要常量内存来序列化任意大的映射。

通过使用[fst] crate中的有限状态转换器,我们获得一个高度压缩的映射,其key --> 偏移量查找时间复杂度为O(key长度)。

示例

use mmap_cache::{FileBuilder, MmapCache};

const INDEX_PATH: &str = "/tmp/mmap_cache_index";
const VALUES_PATH: &str = "/tmp/mmap_cache_values";

// Serialize to files. As required by the finite state transducer (FST) builder,
// keys must be provided in sorted (lexicographical) order.
let mut builder = FileBuilder::create_files(INDEX_PATH, VALUES_PATH)?;
builder.insert(b"abc", b"def")?;
builder.insert(b"foo", b"bar")?;
builder.finish()?;

// Map the files into memory.
let cache = unsafe { MmapCache::map_paths(INDEX_PATH, VALUES_PATH) }?;
let value = unsafe { cache.get_transmuted_value(b"foo") };
assert_eq!(value, Some(b"bar"));

IO并发

当在大型文件上使用memmap2时,访问缓存中的值可能会使线程在操作系统调度程序中阻塞,直到从文件系统填充页面缓存。为了达到某些最大并发N的并发IO,您可以在N线程的线程池中调度您的IO。

许可证:MIT OR Apache 2.0

依赖项

~1.5MB