【发布时间】:2021-12-03 08:56:05
【问题描述】:
我正在尝试使用 Slice 将图像的二进制数据放入 RocksDB。 但是与 BerkeleyDB 相比,RocksDB 的结果太慢了(几乎是 5 倍)。 我想知道我的代码使用 slice 有什么错误。
RocksDB 代码
FILE* file_in;
DB* db;
//default setting
Options options;
options.IncreaseParallelism();
options.OptimizeLevelStyleCompaction();
options.create_if_missing = true;
//open db
Status s = DB::Open(options, kDBPath, &db);
assert(s.ok());
//open file
int fopen_err = fopen_s(&file_in, "test.jpg", "rb");
if (fopen_err != 0) {
printf("File path is not valid\n");;
}
//check file size
fseek(file_in, 0, SEEK_END);
long int file_size = ftell(file_in);
rewind(file_in);
//allocate memory and read file
char* buffer = (char*)calloc(1,file_size);
fread(buffer, file_size, 1, file_in);
//declare slice
std::Slice slice(buffer, file_size);
//insert into db
s = db->Put(WriteOptions(), "10", slice);
assert(s.ok());
//close and clear
fclose(file_in);
free(buffer);
slice.clear();
rocksdb::Status s2 = db -> Close();
if(s2.ok()) delete db;
伯克利数据库
FILE* file_in;
Dbt file_key, file_value;
int flag;
//open db
DB db(0,0);
db.open(NULL, "database", NULL, DB_BTREE, DB_CREATE, 0664);
//set file key 10
file_key.set_size(sizeof(int) + 1);
file_key.set_data("10");
//open file
fopen_s(&file_in, "test.jpg", "rb");
//check file size
fseek(file_in, 0, SEEK_END);
long int file_size = ftell(file_in);
rewind(file_in);
//read file
char* buffer = (char*)malloc(file_size);
fread(buffer, size, 1, file_in);
//set file value
file_value.set_size(file_size + 1);
file_value.set_data(buffer);
//insert
db.put(0,&file_key, &file_value, 0);
//close
fclose(file_in);
free(buffer);
db.close(flag);
我想知道默认设置下 BerkeleyDB 和 RocksDB 之间的性能是自然的还是有更好的方法来提高性能!
【问题讨论】:
标签: c++ slice berkeley-db rocksdb