leveldb学习记录-log文件
log文件在leveldb的主要作用是防止系统宕机的时候,数据丢失。所以在将键值对写入位于内存的memtable之前,会先写入Log文件中,保证数据的持久化。这样即使系统发生故障,memtable中的数据没有及时Dump到磁盘上,LevelDB仍然可以根据log文件恢复数据。
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文件。那问题就来了:
1 | git clone --recurse-submodules https://github.com/google/leveldb.git |
1 | // Amount of data to build up in memory (backed by an unsorted log |
表示一个memtable的最大大小,默认为==4MB==
1 | // Leveldb will write up to this amount of bytes to a file before |
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 中是没有头文件的编译指令的,因此所有需要索引的头文件(或者包含头文件的目录)都需要在项目设置中手动指定。
幸而它会递归搜索所有子目录,所以只要设置根目录就可以了。当然还可以根据需要,逐个添加部分自己感兴趣的目录。
毕竟文件越多,索引的越慢。
由于其索引器是静态链接 clang 的相关库,所以一些 Visual Studio 特有的编译参数(/ 开头)并不支持,这其实并不影响索引,手动移除即可。
对项目设置额外的编译器参数 -driver=cl 并不起作用。
如果项目启用了合并编译,则一些源文件会标记为 ExcludeFromBuild,这些文件就不会出现在 compile_commands.json,也就不会被索引。自己想办法替换成原始的文件吧。
leveldb使用的仍然是C++标准库中的互斥量和条件变量,做了简单的封装port/port_stdcxx.h
教程链接:https://www.tensorflow.org/install/pip
2020年11月我学习了leveldb,google开发的一个高效KV数据库
ubuntu16.04 RTX2080Ti
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
在文本最后添加以下内容: