【问题标题】:How to skip some keys by using iterator?如何使用迭代器跳过一些键?
【发布时间】:2019-06-06 12:45:24
【问题描述】:

作为一个例子,我已经向 DB 添加了几个键,就像,

<1 + 2> 
<1 + 3>
<2 + 1>
<2 + 4>
<3 + 2>

首先,Seek() 到 ,然后 Next() 到 之后,我想跳过键 和 (其前缀都是 2)并将迭代器移动到 而不进行新的 seek 操作。 使用新的Seek() 操作是出乎意料的,因为Seek() 很昂贵。 我应该使用哪种方法?

这种跳过扫描方式类似于this

我更喜欢像下面这样编程:

DBIter* it = NewDBIterator(...);
set = {key1, key2, key3, ...};
Iterator key_iter = set.begin();
for (it->SeekToFirst(); it->Valid() && key_iter != set.end(); it->SkipToNext(*key_iter), ++ key_iter) {
  // do something
}

【问题讨论】:

    标签: leveldb rocksdb lsm-tree


    【解决方案1】:

    如帖子中所述,您在假设键按顺序存储的情况下,通过查看键前缀来链接跳过扫描。如果您正在寻找 第二个关键部分的任意值小于3 in:

    1,2
    1,3
    1,4
    2,1
    2,2
    2,3
    ...
    

    当您达到 1,3 时,您会知道将不再有与您的谓词匹配的键前缀为 1 的键,因此您可以跳到下一个键前缀。这通常仍然意味着您必须在查找下一个前缀的过程中至少查看每个键前缀,或者以某种方式查找它。这是否好取决于。对于一组不同的键的操作,单独查找几乎肯定是更好的选择,因为除非你非常清楚你的数据是什么样的,否则你不知道你必须前缀扫描的键的数量,你可能有查看每一个 (O(n)),其中 k 次查找只需要 O(k) * O(log(n)) 时间。所以只要k

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 2014-06-15
      • 2015-08-16
      • 1970-01-01
      相关资源
      最近更新 更多