通过DB::CompactRange 或者 DB::CompactFiles,可以手动触发压缩。这是给高级用户开发自定义压缩策略使用的,包括但不限于以下使用方法:
CompactRange
来把数据压缩到最底层,然后把文件移动到目标层。下面的例子展现如何使用这些API。
Options dbOptions;
DB* db;
Status s = DB::Open(dbOptions, "/tmp/rocksdb", &db);
// Write some data
...
Slice begin("key1");
Slice end("key100");
CompactRangeOptions options;
s = db->CompactRange(options, &begin, &end);
或者
CompactionOptions options;
std::vector<std::string> input_file_names;
int output_level;
...
Status s = db->CompactFiles(options, input_file_names, output_level);
begin和end参数定义需要压缩的key的范围。根据db使用的压缩风格而有不同的行为。在universal和FIFO压缩风格,begin和end参数会被忽略,所有文件都会被压缩。另外,每一层的文件都会被压缩,并且留在本层。对于leveled压缩风格,所有包含有key范围的文件都会被压缩到最底层。如果begin或者end为NULL,这意味着使用第一个的key或者最后一个的key。
如果多于一个线程调用了人工压缩,只有一个会真正被调度,而其他线程会等待已经调度的压缩完成。如果CompactRangeOptions::exclusive_manual_compaction被设置为true,调用会禁止自动压缩工作的调度,然后等待已经开始的自动压缩工作停止。
CompactRangeOptions支持以下选项:
这个接口会压缩所有输入文件到一系列输出文件,然后放在output_level中。输出文件的大小取决于数据的大小以及CompactionOptions::output_file_size_limit的设定。这个API在ROCKSDB_LITE里面不支持。