leveldb学习记录-各组件的默认大小
memtable的大小
1 | // Amount of data to build up in memory (backed by an unsorted log |
表示一个memtable的最大大小,默认为==4MB==
sstable的大小
1 | // Leveldb will write up to this amount of bytes to a file before |
sstable默认为2MB
level0的文件大小
level 0 的文件是无序的,每次查找 level 0都需要查找所有文件,因此需要严格控制个数。
当文件数目 >= config::kL0_SlowdownWritesTrigger 时,通过 sleep 延缓写入,当文件数目 >= config::kL0_StopWritesTrigger时,则完全停止写入,等待后台 compaction.这两个数字分别是 8 和 12.
由于 memtable 是通过 BuildTable 一次性生成一个文件,因此文件大小 ~ 4M左右.
compact 会有一个 score 的筛选,其中 level 0 的计算公式为:
1 | score = v->files_[level].size() / |
当 score >= 1.0 时,就会触发往下层的文件归并操作,因此可以认为 level 0 比较理想的个数应当 < config::kL0_CompactionTrigger,该值为 4.
level 1+ 的文件大小及个数
level 最大一共是 7层,范围是[0, kNumLevels = 7).
各 level 的文件都是归并生成的,在DoCompactionWork生成文件,当文件大小超过MaxOutputFileSize时,则重新打开新文件写入。这个大小对所有 level 都是一样的,默认值是options->max_file_size = 2M.
每次的文件总大小是MaxBytesForLevel,随着 level 增大,从10M到1T.
| level | single file size | totla file size |
|---|---|---|
| 0 | 4M | 4M*(4 or 8 or 12) |
| 1 | 2M | 10M |
| 2 | 2M | 100M |
| 3 | 2M | 1G |
| 4 | 2M | 10G |
| 5 | 2M | 100G |
| 6 | 2M | 1T |
sstable data block的默认大小为4K
1 | // Approximate size of user data packed per block. Note that the |