Pregunta

¿Está buscando un rango de gabinete de Kyoto? ¿Buscando una gama de llaves? Si es así, ¿qué tipos de llaves apoyan la búsqueda de rango? ¿Puedo hacer gama de búsqueda en una llave larga (64bit)?

gracias RG

¿Fue útil?

Solución

LEVELDB Soporta las teclas binarias y las consultas a distancia.

Editar: Olvidé mencionar que para que la consulta del rango funcione, el valor binario debe enviarse de una manera comparable.Para su largo ejemplo, debe asegurarse de que esté codificado por Big-Endian.

Otros consejos

Es compatible con la consulta de prefijo clave, sin embargo, la eficiencia de la consulta del prefijo depende de la estructura de almacenamiento interna.Si está utilizando HashDB, puede que no sea una buena idea, ya que las teclas y los valores se dispersan en el archivo de subrayado.

Sí, para enteros.

B + Tree Database admite el acceso secuencial en orden de las claves, que realiza la búsqueda de cadenas de reenvío de cadenas y rango de enteros: desde DOCS

Sí, puedes, solo necesitas un salto hacia adelante.

Un ejemplo que utiliza C. Tiendas 5 registros con llaves de 64 bits (de 1 a 5) y luego aplicar un filtro (de 2 a 4):

#include <kclangc.h>
#include <inttypes.h>

int main(void)
{
    KCDB *db;
    KCCUR *cur;
    char *kbuf;
    size_t ksiz, vsiz;
    const char *cvbuf;
    int64_t i, val, min, max;
    int64_t keys[] = {1, 2, 3, 4, 5};
    const char *values[] = {"one", "two", "three", "four", "five"};
    char i64[8]; /* A buffer to store byte sequences */

    /* create the database object */
    db = kcdbnew();
    /* open the database */
    if (!kcdbopen(db, "db64.kct", KCOWRITER | KCOCREATE)) {
        fprintf(stderr, "open error: %s\n", kcecodename(kcdbecode(db)));
    }
    /* store records */
    for (i = 0; i < 5; i++) {
        memcpy(i64, &keys[i], 8);
        if (!kcdbset(db, i64, 8, values[i], strlen(values[i]))) {
            fprintf(stderr, "set error: %s\n", kcecodename(kcdbecode(db)));
            exit(EXIT_FAILURE);
        }
    }
    /* traverse records */
    min = 2;
    max = 4;
    printf("Range from %" PRId64 " to %" PRId64 "\n", min, max);
    memcpy(i64, &min, 8);
    cur = kcdbcursor(db);
    kccurjumpkey(cur, i64, 8);
    while ((kbuf = kccurget(cur, &ksiz, &cvbuf, &vsiz, 1)) != NULL) {
        memcpy(&val, kbuf, 8);
        if (val > max) {
            break;
        }
        printf("Found %s\n", cvbuf);
        kcfree(kbuf);
    }
    kccurdel(cur);
    /* close the database */
    if (!kcdbclose(db)) {
        fprintf(stderr, "close error: %s\n", kcecodename(kcdbecode(db)));
    }
    /* delete the database object */
    kcdbdel(db);
    return 0;
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top