【问题标题】:Key size change for leveldbleveldb 的密钥大小更改
【发布时间】:2016-04-19 21:53:20
【问题描述】:

我们使用 leveldb 为磁盘索引数据块,并且每个磁盘使用一个 leveldb 实例。 索引的键是 由于某些历史原因,指纹存在于密钥中(我不知道) 我们计划从密钥中去掉这个指纹后缀(因为我们得出结论,我们可以只使用 inode 和 page_offset 来保持密钥的唯一性)。

问题是从旧版本升级到新版本,我们需要在短时间内维护两个索引,直到第一个索引空闲。 问题是,有没有办法使用相同的旧索引并更改新密钥插入的密钥大小,并且在查找期间忽略后缀部分只使用 旧密钥?

如果我的问题不是很清楚,请告诉我。

【问题讨论】:

    标签: leveldb


    【解决方案1】:

    您可以在leveldb::Options.comparator 上做一些工作,默认情况下是leveldb::BytewiseComparatorImpl
    例如,您可以定义一个名为 IgnoreSuffixComparatorImpl 的类:

    #include "leveldb/comparator.h"
    class IgnoreSuffixComparatorImpl : public Comparator {
      ...
      virtual int Compare(const Slice& a, const Slice& b) const {
         return removeSuffix(a).compare(removeSuffix(b));
      }
      ...
    }
    

    然后,当你初始化 db 时,你可以使用新的比较器:

    options.comparator = new IgnoreSuffixComparatorImpl();
    s = leveldb::DB::Open(options, db_path, manifest, &db);
    

    【讨论】:

    • 谢谢自私。我做了类似的事情,它奏效了。修改了比较器以在比较键时将键的长度作为第一件事。因此,新的索引键可以与旧的键共存。谢谢回复。
    猜你喜欢
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    相关资源
    最近更新 更多