固定大小键的最快持久键/值数据库并且仅插入/获取(无删除/更新)? [关闭]
Posted
技术标签:
【中文标题】固定大小键的最快持久键/值数据库并且仅插入/获取(无删除/更新)? [关闭]【英文标题】:Fastest persistent key/value db for fixed size keys and only insert/fetch (no delete/update)? [closed] 【发布时间】:2014-07-25 20:34:13 【问题描述】:鉴于持久键/值存储的以下要求:
只需要获取、插入和完整迭代所有值(用于导出) 禁止删除值或更新值 键的大小始终相同 嵌入在宿主应用程序中的代码鉴于这种使用模式:
获取是随机的 插入和提取是交错的,无法预测 密钥是随机的,按随机顺序插入根据要求,最好的磁盘数据结构/算法是什么?
自定义实现能否超越基于 LSM(日志结构化合并)的实现(即 leveldb、rocksdb)的性能?
针对这些要求的高性能自定义实现在实现上是否也会相当简单?
【问题讨论】:
键是否会按排序顺序插入?提取是特定的键、范围还是通配符? @ChrisShain 问题已更新以提供使用模式 如果你一直插入键但从不删除键,你最终会耗尽空间。那么在你的工作量中,你会在某个时候停止写作吗? @keelar 写入永远不会停止,密钥永远不会从数据库中删除。如果服务器操作员只想保留一定数量的历史记录,则有一个手动过程,其中服务器被关闭并运行一个单独的作业,将现有数据库中的所有数据复制到新数据库中,减去属于分类帐的条目太旧了。这就是为什么需要“迭代所有值”(对于此导出)。 【参考方案1】:虽然可能有更好的性能自定义实现来满足您的要求,但在您的情况下,配置良好的 RocksDB 应该能够击败大多数此类自定义实现。这是我要配置 RocksDB 的内容:
首先,由于您没有更新和删除,最好将所有数据压缩到 RocksDB 中的大文件中。由于 RocksDB 以可自定义的顺序对这些键进行排序,因此拥有一些大文件可以让您获得更快的读取性能,因为跨一些大文件的二进制搜索比跨多个小文件更快。通常,拥有大文件会损害压缩的性能 --- 重组 RocksDB 中大部分数据的过程,以便 1. 与单个键关联的多个更新将被合并; 2. 执行删除以释放磁盘空间; 3. 保持数据排序。但是,由于您没有更新和删除,因此拥有大文件可为您提供快速的读写性能。
其次,为布隆过滤器指定大位,当您可能发出一些在 RocksDB 中不存在键的查询时,这可以避免大多数 IO。
所以读取请求是这样的。首先,它将查询键与那些大文件的键范围进行比较,以确定查询键可能位于哪个文件。然后,一旦 key-range 的文件覆盖了查询 key,它将计算查询 key 的bloom bits 以查看这些文件中是否存在查询 key。如果是这样,则将触发每个文件内部的二进制搜索以识别匹配的数据。
关于扫描操作,由于 RocksDB 内部按照用户自定义的顺序对数据进行排序,使用 RocksDB 的迭代器可以非常有效地完成扫描。
有关 RocksDB 基础知识的更多信息,请访问here。
【讨论】:
这正是我想知道的——自定义实现能否击败 RocksDB?听起来你在说不。如果性能优于 RocksDB 的可能性很小,我不想浪费时间尝试编写专门的东西。 我们从不进行批量加载。 @VinnieFalco:我已经更新了答案。基本上将 RocksDB 配置为具有大文件仍然适用,因为您没有更新和删除。这使您可以更快地读取和写入而不会受到太大影响。以上是关于固定大小键的最快持久键/值数据库并且仅插入/获取(无删除/更新)? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
仅使用带有键的 unordered_map 来存储指针(忽略值)