首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rocks DB的Java支持前缀扫描吗?

Rocks DB的Java支持前缀扫描吗?
EN

Stack Overflow用户
提问于 2016-07-07 11:16:40
回答 3查看 2.8K关注 0票数 2

我有巨大的数据集(键值)在Rocks中,我必须搜索基于键前缀的键在手上。我不想扫描整个数据集,以筛选出基于密钥前缀的密钥。有什么办法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-17 09:10:37

你可以用这样的东西。使用RocksIterator,有一个api公开了,您可以在其中查找键子字符串,如果您的键以前缀开头,那么请考虑该键。

请找到样本代码。

代码语言:javascript
复制
List<String> result = new ArrayList<String>();
RocksIterator iterator = db.newIterator();
for (iterator.seek(prefix.getBytes()); iterator.isValid(); iterator
                .next()) {
           String key = new String(iterator.key());
            if (!key.startsWith(prefix))
            break;
      result.add(String.format("%s", new String(iterator.key())));
}

希望它能帮到你。

票数 4
EN

Stack Overflow用户

发布于 2022-06-20 09:54:45

@Pramatha V的答案很好,尽管我对代码做了一些改进。我不是在每次迭代中反序列化迭代器键。我正在使用来自Bytes.increment()卡夫卡常见用途 (您可以提取这个类并直接在代码中使用它)。这个函数通过添加1来增加底层字节数组。通过这种方法,我可以找到下一个比前缀键更大的键。我使用BYTES_LEXICO_COMPARATOR (也来自同一个类)进行比较,但是您可以自由地实现和使用您的比较器。此外,函数返回字节数组的映射,您可以在后面的代码中反序列化该映射。

代码语言:javascript
复制
public Map<byte[], byte[]> prefixScan(final byte[] prefix) {
    final Map<byte[], byte[]> result = new HashMap<>();
    RocksIterator iterator = db.newIterator();

    byte[] rawLastKey = increment(prefix);
    for (iterator.seek(prefix); iterator.isValid(); iterator.next()) {

        if (Bytes.BYTES_LEXICO_COMPARATOR.compare(iterator.key(), rawLastKey) > 0
                || Bytes.BYTES_LEXICO_COMPARATOR.compare(iterator.key(), rawLastKey) == 0) {
            break;
        }

        result.put(iterator.key(), iterator.value());
    }

    iterator.close();
    return result;
}
票数 0
EN

Stack Overflow用户

发布于 2020-06-21 22:09:01

搜寻工作很慢。在SSD磁盘上5.35秒,10亿条记录。

键的大小是固定的16个字节。搜索8个字节。

2个长字节xx,xx

搜索1长至8个字节。

使用ColumnFamily来映射密钥。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38244095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档