log文件在leveldb的主要作用是防止系统宕机的时候,数据丢失。所以在将键值对写入位于内存的memtable之前,会先写入Log文件中,保证数据的持久化。这样即使系统发生故障,memtable中的数据没有及时Dump到磁盘上,LevelDB仍然可以根据log文件恢复数据。

阅读全文 »

前面讲了SSTable文件,这种文件是leveldb的最终形态、落盘文件,在该文件中,key-value是有序的,它位于磁盘上。很明显客户输入的key-value对的顺序是不可预知的,是无序,因此SSTable肯定不是直接对应用户的put key-value操作。

直接应对客户put操作的数据结构是MemTable,它是一个存在在内存中的数据结构,内部也是有序的,使用SkipList来组织用户输入的key-value对。(为了防范异常掉电,所以引入了log文件)。

这里面就存在一个问题了,用户的输入的数据暂时记录在MemTable,而最终落在磁盘上的是SSTable文件。那问题就来了:

阅读全文 »

memtable的大小

1
2
3
4
5
6
7
8
9
// Amount of data to build up in memory (backed by an unsorted log
// on disk) before converting to a sorted on-disk file.
//
// Larger values increase performance, especially during bulk loads.
// Up to two write buffers may be held in memory at the same time,
// so you may wish to adjust this parameter to control memory usage.
// Also, a larger write buffer will result in a longer recovery time
// the next time the database is opened.
size_t write_buffer_size = 4 * 1024 * 1024;//memtable的最大size

表示一个memtable的最大大小,默认为==4MB==

sstable的大小

1
2
3
4
5
6
7
8
9
// Leveldb will write up to this amount of bytes to a file before
// switching to a new one.
// Most clients should leave this parameter alone. However if your
// filesystem is more efficient with larger files, you could
// consider increasing the value. The downside will be longer
// compactions and hence longer latency/performance hiccups.
// Another reason to increase this parameter might be when you are
// initially populating a large database.
size_t max_file_size = 2 * 1024 * 1024;//最大文件尺寸

sstable默认为2MB

阅读全文 »

LevelDB 首先会去查看内存中的 Memtable,如果 Memtable 中包含 key 及其对应的value,则返回 value 值即可;

如果在 Memtable 没有读到key,则接下来到同样处于内存中的 Immutable Memtable 中去读取,类似地,如果读到就返回,若是没有读到,那么只能万般无奈下从磁盘中的大量SSTable文件中查找。

阅读全文 »

基本原理是通过生成 cmake生成compile_commands.json

这个文件记录了所有C++文件的编译指令

cmake项目采用如下指令:

1
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1

非cmake项目,如 Visual Studio 有官方的插件,其它 IDE 也有相应的官方插件。

  • 根据 compile_commands.json 中的条目,逐一解析索引相关 C++ 源文件,收集所有信息存储在本地数据库中,并生成全文索引信息。
  • 根据查询需求,展示所有相关信息。

注意事项

由于 compile_commands.json 中是没有头文件的编译指令的,因此所有需要索引的头文件(或者包含头文件的目录)都需要在项目设置中手动指定。
幸而它会递归搜索所有子目录,所以只要设置根目录就可以了。当然还可以根据需要,逐个添加部分自己感兴趣的目录。
毕竟文件越多,索引的越慢。
由于其索引器是静态链接 clang 的相关库,所以一些 Visual Studio 特有的编译参数(/ 开头)并不支持,这其实并不影响索引,手动移除即可。
对项目设置额外的编译器参数 -driver=cl 并不起作用。
如果项目启用了合并编译,则一些源文件会标记为 ExcludeFromBuild,这些文件就不会出现在 compile_commands.json,也就不会被索引。自己想办法替换成原始的文件吧。

阅读全文 »

ubuntu16.04 RTX2080Ti

一、安装NVIDIA驱动

1.下载驱动文件
去官网下载和自己的显卡适配的驱动文件,是个.run文件。贴个下载地址:https://www.nvidia.cn/Download/index.aspx

search之后下载就行,记住它下载到了哪个文件夹里,以后会用的到
2.文件已经下载好了,但是在安装之前我我们需要做一些准备。
(1)、删除原有驱动(可选):$ sudo apt-get remove –purge nvidia*
我在删除的时候就提示我没有原有的驱动。
(2)、禁用nouveau,安装NVIDIA需要把系统自带的驱动禁用
打开文件:sudo gedit /etc/modprobe.d/blacklist.conf
在文本最后添加以下内容:

阅读全文 »