RocksDB - 在相同 KEY-VALUEs 的 2 次 Put 操作后,数据库大小加倍
RocksDB - Double db size after 2 Put operations of same KEY-VALUEs
我有一个使用 RocksDB 的程序试图将大量的 KEY-VALUE 对写入数据库:
int main() {
DB* db;
Options options;
// Optimize RocksDB. This is the easiest way to get RocksDB to perform well
options.IncreaseParallelism(12);
options.OptimizeLevelStyleCompaction();
// create the DB if it's not already present
options.create_if_missing = true;
// open DB
Status s = DB::Open(options, kDBPath, &db);
assert(s.ok());
for (int i = 0; i < 1000000; i++)
{
// Put key-value
s = db->Put(WriteOptions(), "key" + std::to_string(i), "a hard-coded string here");
assert(s.ok());
}
delete db;
return 0;
}
当我第一次运行这个程序时,它生成了大约2GB的数据库,我试了几次运行这个程序,没有任何改变,我得到了N*2GB数据库 N=number-of-run
。直到一定数量的 N,数据库大小开始减少。
但是无论我期望的是,如果批次没有更改,写入数据库的新批次数据应该在每个 运行 之后被覆盖 -> 然后数据库的大小应该在每个 运行 之后为 ~2GB。
问题:这是 RocksDB 的问题,如果不是,在类似的 KEY-VALUE 写入对的情况下,什么是保持数据库大小稳定的正确设置?
完全压缩可以减少space的使用,只需在delete db;
之前添加这一行:
db->CompactRange(CompactRangeOptions(), nullptr, nullptr);
注意:完全压缩确实需要一些时间,具体取决于数据大小。
Space 预计放大,全部 LSM tree data structure DBs have this issue: https://github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide#amplification-factors
这是一篇关于 space rocksdb 放大研究的优秀论文:http://cidrdb.org/cidr2017/papers/p82-dong-cidr17.pdf
我有一个使用 RocksDB 的程序试图将大量的 KEY-VALUE 对写入数据库:
int main() {
DB* db;
Options options;
// Optimize RocksDB. This is the easiest way to get RocksDB to perform well
options.IncreaseParallelism(12);
options.OptimizeLevelStyleCompaction();
// create the DB if it's not already present
options.create_if_missing = true;
// open DB
Status s = DB::Open(options, kDBPath, &db);
assert(s.ok());
for (int i = 0; i < 1000000; i++)
{
// Put key-value
s = db->Put(WriteOptions(), "key" + std::to_string(i), "a hard-coded string here");
assert(s.ok());
}
delete db;
return 0;
}
当我第一次运行这个程序时,它生成了大约2GB的数据库,我试了几次运行这个程序,没有任何改变,我得到了N*2GB数据库 N=number-of-run
。直到一定数量的 N,数据库大小开始减少。
但是无论我期望的是,如果批次没有更改,写入数据库的新批次数据应该在每个 运行 之后被覆盖 -> 然后数据库的大小应该在每个 运行 之后为 ~2GB。
问题:这是 RocksDB 的问题,如果不是,在类似的 KEY-VALUE 写入对的情况下,什么是保持数据库大小稳定的正确设置?
完全压缩可以减少space的使用,只需在delete db;
之前添加这一行:
db->CompactRange(CompactRangeOptions(), nullptr, nullptr);
注意:完全压缩确实需要一些时间,具体取决于数据大小。
Space 预计放大,全部 LSM tree data structure DBs have this issue: https://github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide#amplification-factors
这是一篇关于 space rocksdb 放大研究的优秀论文:http://cidrdb.org/cidr2017/papers/p82-dong-cidr17.pdf