Closed. This question needs to be more focused。它当前不接受答案。












想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。

已关闭6年。



Improve this question




给定持久键/值存储的以下要求:
  • 仅需要获取,插入和所有值的完整迭代(用于导出)
  • 没有删除值或更新值
  • 键的大小始终相同
  • 嵌入在主机应用程序
  • 中的代码

    并给出以下使用模式:
  • 访存是随机的
  • 插入和提取被交错,没有可预测性
  • 键是随机的,并以随机顺序插入

  • 根据要求,最佳的磁盘数据结构/算法是什么?

    自定义实现是否可以超过基于LSM(日志结构合并)的实现(即leveldb,rocksdb)的性能?

    满足这些要求的高性能定制实现是否也将简化实现?

    最佳答案

    尽管可能可以为您的需求提供更好的性能自定义实现,但是配置良好的RocksDB应该能够胜任大多数此类自定义实现。这是我要配置RocksDB的内容:

    首先,由于您没有更新和删除,因此最好将所有数据压缩为RocksDB 中的大文件。因为RocksDB以可自定义的顺序对这些键进行排序,所以拥有一些大文件可以提高读取性能,因为在一些大文件中进行二进制搜索比在多个小文件中进行二进制搜索要快。通常,拥有大文件会损害压缩性能---在RocksDB中重组大部分数据的过程,这样1.与单个 key 关联的多个更新将被合并; 2.执行删除以释放磁盘空间; 3.保持数据排序。但是,由于您没有更新和删除,因此拥有大文件可提高您的读写性能。

    其次,为bloom过滤器指定大位,当您可能发出一些RocksDB中不存在键的查询时,这可以避免大多数IO。

    因此,读取请求是这样的。首先,它将查询关键字与那些大文件的关键字范围进行比较,以识别查询关键字可能位于的文件。然后,一旦关键范围的文件覆盖了查询关键字,它将计算查询关键字的bloom位,以查看查询关键字是否可能存在于那些文件中。如果是这样,则将触发每个文件内的二进制搜索,以识别匹配的数据。

    至于扫描操作,由于RocksDB在内部以用户可自定义的顺序对数据进行排序,因此可以使用RocksDB的迭代器非常高效地完成扫描。

    可以在here中找到有关RocksDB基础知识的更多信息。

    关于database - 固定大小的键和仅插入/提取(无删除/更新)的最快持久键/值db?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24050205/

    10-14 12:28