注意

点击此处查看此分支的 CocoaPods 特定构建和发布说明。


LevelDB 是 Google 开发的一个快速键值存储库,它提供从字符串键到字符串值的有序映射。

Build Status Build status

作者:Sanjay Ghemawat (sanjay@google.com) 和 Jeff Dean (jeff@google.com)

特性

文档

LevelDB 库文档在线提供并与源代码捆绑在一起。

限制

获取源代码

git clone --recurse-submodules https://github.com/google/leveldb.git

构建

该项目开箱即用地支持 CMake

为 POSIX 构建

快速开始

mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .

为 Windows 构建

首先生成 Visual Studio 2017 项目/解决方案文件

mkdir build
cd build
cmake -G "Visual Studio 15" ..

默认设置将为 x86 构建。 对于 64 位,请运行

cmake -G "Visual Studio 15 Win64" ..

要从命令行编译 Windows 解决方案

devenv /build Debug leveldb.sln

或者在 Visual Studio 中打开 leveldb.sln 并从中构建。

有关更高级的用法,请参阅 CMake 文档和 CMakeLists.txt

为 leveldb 项目做贡献

leveldb 项目欢迎贡献。 leveldb 的主要目标是成为一个可靠且快速的键/值存储。 将考虑符合上述功能/限制并满足以下要求的更改。

贡献要求

  1. 仅限测试平台。 我们通常只会接受为已编译和测试的平台进行的更改。 这意味着 POSIX(对于 Linux 和 macOS)或 Windows。 有时会接受非常小的更改,但请将其视为例外而不是规则。

  2. 稳定的 API。 我们努力维护稳定的 API。 需要更改使用 leveldb 的项目可能会被拒绝,除非对项目有足够的好处。

  3. 测试:所有更改必须附带新的(或更改的)测试,或者充分的解释,说明为什么不需要新的(或更改的)测试。

  4. 一致的风格:该项目符合 Google C++ 风格指南。 为确保您的更改格式正确,请运行

    clang-format -i --style=file <file>
    

提交拉取请求

在接受任何拉取请求之前,作者必须首先在 https://cla.developers.google.com/ 签署贡献者许可协议 (CLA)。

为了保持提交时间线是线性的,请将您的更改压缩为单个提交,并在 google/leveldb/master 上进行 rebase。 这使提交时间线保持线性,并且更易于与 Google 的内部存储库同步。 更多信息请访问 GitHub 的 关于 Git rebase 页面。

性能

这是一个性能报告(带有解释),来自包含的 db_bench 程序的运行。 结果有些嘈杂,但应该足以获得一个大概的性能估计。

设置

我们使用一个包含一百万个条目的数据库。 每个条目都有一个 16 字节的键和一个 100 字节的值。 基准测试使用的值压缩到大约原始大小的一半。

LevelDB:    version 1.1
Date:       Sun May  1 12:11:26 2011
CPU:        4 x Intel(R) Core(TM)2 Quad CPU    Q6600  @ 2.40GHz
CPUCache:   4096 KB
Keys:       16 bytes each
Values:     100 bytes each (50 bytes after compression)
Entries:    1000000
Raw Size:   110.6 MB (estimated)
File Size:  62.9 MB (estimated)

写入性能

“fill” 基准测试以顺序或随机顺序创建一个全新的数据库。 “fillsync” 基准测试在每次操作后将数据从操作系统刷新到磁盘; 其他写入操作会将数据暂时保存在操作系统缓冲区缓存中。 “overwrite” 基准测试执行随机写入,以更新数据库中现有的键。

fillseq      :       1.765 micros/op;   62.7 MB/s
fillsync     :     268.409 micros/op;    0.4 MB/s (10000 ops)
fillrandom   :       2.460 micros/op;   45.0 MB/s
overwrite    :       2.380 micros/op;   46.5 MB/s

上面的每个“op”对应于单个键/值对的写入。 也就是说,随机写入基准测试的速度约为每秒 400,000 次写入。

每个 "fillsync" 操作的成本 (0.3 毫秒) 比磁盘寻道 (通常为 10 毫秒) 低得多。 我们怀疑这是因为硬盘本身正在其内存中缓冲更新并在数据写入盘片之前做出响应。 根据硬盘是否有足够的电量在断电时保存其内存,这可能安全也可能不安全。

读取性能

我们列出了在正向和反向方向上顺序读取的性能,以及随机查找的性能。 请注意,基准测试创建的数据库非常小。 因此,该报告描述了当工作集适合内存时 leveldb 的性能。 读取操作系统缓冲区缓存中不存在的数据的成本将主要取决于从磁盘获取数据所需的一个或两个磁盘寻道。 写入性能主要不受工作集是否适合内存的影响。

readrandom  : 16.677 micros/op;  (approximately 60,000 reads per second)
readseq     :  0.476 micros/op;  232.3 MB/s
readreverse :  0.724 micros/op;  152.9 MB/s

LevelDB 在后台压缩其底层存储数据,以提高读取性能。 上面列出的结果是在大量随机写入后立即完成的。 压缩后(通常是自动触发的)的结果会更好。

readrandom  : 11.602 micros/op;  (approximately 85,000 reads per second)
readseq     :  0.423 micros/op;  261.8 MB/s
readreverse :  0.663 micros/op;  166.9 MB/s

读取的高成本部分来自重复解压缩从磁盘读取的块。 如果我们为 leveldb 提供足够的缓存,使其可以将未压缩的块保存在内存中,则读取性能会再次提高

readrandom  : 9.775 micros/op;  (approximately 100,000 reads per second before compaction)
readrandom  : 5.215 micros/op;  (approximately 190,000 reads per second after compaction)

存储库内容

有关更多说明,请参阅 doc/index.md。 有关实现的简要概述,请参阅 doc/impl.md

公共接口位于 include/leveldb/*.h 中。 调用者不应包含或依赖此包中任何其他头文件的详细信息。 这些内部 API 可能会在没有警告的情况下更改。

头文件指南


CocoaPods

CocoaPods 1.x 当前不支持带有 C++ 标头的库。 参见 CocoaPods/CocoaPods#5152。解决方法是使用 CocoaPods 选项 --skip-import-validation

更新 podspec(假设库没有更改)