gpt4 book ai didi

使用 C 中的 tokyo Cabinet 按值自定义排序

转载 作者:行者123 更新时间:2023-11-30 17:35:51 24 4
gpt4 key购买 nike

我正在使用 tokyo Cabinet 实现 btree,但我想知道是否可以保持值排序。我知道我可以使用 tcbdbsetcmpfunc 来设置键的自定义比较函数,但不确定这些值?

我问这个问题是因为大多数时候我只需要前 1000 条记录(假设我的值已排序)。否则,我将不得不遍历数百万条记录,对它们进行排序并获取前 1000 条,这可能会很慢。

例如:

#include <tcutil.h>
#include <tcbdb.h>
#include <stdbool.h>
#include <stdint.h>

struct foo {
int one;
double two;
char *three;
};

// sort by three field
static int val_cmp(const char *aptr, int asiz, const char *bptr, int bsiz, void *op) {
return 1;
}

int main() {
int ecode;
TCBDB *db;
db = tcbdbnew();
struct foo *f;

tcbdbsetcmpfunc(db, val_cmp, f); // sort by struct->three?

// open the database
if(!tcbdbopen(db, "struct.tcb", BDBOWRITER | BDBOCREAT)){
ecode = tcbdbecode(db);
fprintf(stderr, "open error: %s\n", tcbdberrmsg(ecode));
}

f = malloc(sizeof(struct foo));
f->one = 100;
f->two = 1.1111;
f->three = "Hello World";
printf("put: %d\n", tcbdbput(db, "foo", 3, f, sizeof(struct foo)));

f = malloc(sizeof(struct foo));
f->one = 100;
f->two = 1.1111;
f->three = "Hello Planet";
printf("put: %d\n", tcbdbput(db, "bar", 3, f, sizeof(struct foo)));

char *key;
BDBCUR *cursor;
cursor = tcbdbcurnew(db);
tcbdbcurfirst(cursor);
while ((key = tcbdbcurkey2(cursor)) != NULL) {
struct foo *val;
int size;
val = tcbdbcurval(cursor, &size);
printf("%s: one=%d\n", key, val->one);
printf("%s: two=%f\n", key, val->two);
tcbdbcurnext(cursor);
}
tcbdbdel(db);
return 0;
}

最佳答案

我认为您无法定义值的顺序。

我建议有第二个 tokyabinet 数据库,映射从值到键。我希望通过这个间接您仍然可以获得不错的性能。

关于使用 C 中的 tokyo Cabinet 按值自定义排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22870286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com