Caffe代码导读(3):LevelDB例程
2016-06-23 10:36
429 查看
转载自:
Caffe代码导读(3):LevelDB例程 - 卜居 - 博客频道 - CSDN.NET http://blog.csdn.net/kkk584520/article/details/41056783
Caffe自带例子Cifar10中使用leveldb存储输入数据,为此我们研究一下怎样使用它。安装步骤可以参考http://blog.csdn.net/kangqing2003/article/details/6658345
Leveldb库提供了一种持续的键值对存储方式。键和值可以为任意字节数组。键存储顺序可由用户定义的比较函数决定。
打开一个数据库
Leveldb数据库有个与文件系统目录相对应的名字。数据库的所有内容都保存在这个目录中。下面例子展示了怎样打开一个数据库,必要时创建它:
[cpp]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
#include <assert>
#include "leveldb/db.h"
leveldb::DB* db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options,"/tmp/testdb", &db);
assert(status.ok());
如果你想在数据库已经存在情况下报错,只需要在leveldb::DB::Open调用前增加以下代码
[cpp]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
options.error_if_exists = true;
状态
你可能注意到了上面的leveldb::Status类型。Leveldb中大多数可能遇到错误的函数返回该类型的值。你可以检查返回值是否为ok,必要时可打印相应的错误信息:
[cpp]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
leveldb::Status s = ...;
if(!s.ok()) cerr << s.ToString() << endl;
关闭数据库
当你操作完一个数据库,只需delete掉数据库对象。例子:
[cpp]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
...open the db as described above ...
... dosomething with db ...
deletedb;
读和写
数据库提供Put,Delete和Get方法来修改/检索数据库。例如,下面代码将key1键下的值value移动到key2键下:
[cpp]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
std::string value;
leveldb::Status s = db->Get(leveldb::ReadOptions(), key1,&value);
if(s.ok()) s = db->Put(leveldb::WriteOptions(), key2, value);
if(s.ok()) s = db->Delete(leveldb::WriteOptions(), key1);
原子更新
注意到如果进程在key2 Put操作后、key1 delete操作前终止,那么相同的值value可能留存在多个键下。这类问题可以使用WriteBatch类避免,该类可以原子地应用一系列更新:
[cpp]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
#include "leveldb/write_batch.h"
...
std::string value;
leveldb::Status s = db->Get(leveldb::ReadOptions(), key1,&value);
if(s.ok()) {
leveldb::WriteBatch batch;
batch.Delete(key1);
batch.Put(key2, value);
s =db->Write(leveldb::WriteOptions(), &batch);
}
WriteBatch持有一系列针对数据库的编辑操作,这些操作将在一个batch内顺序执行。注意到我们在Put前调用Delete,这样如果key1恰好等于key2时,最终我们不会错误地丢掉整个value。
除了原子操作的优点,WriteBatch也可以用于加速批量更新操作,只需要将大量独立的改动操作放到同一个batch中。
同步写
默认情况下,每次写到leveldb都是异步的:进程一旦将写操作推送给操作系统就返回。操作系统内存到非易失存储的传输将异步发生。在某次写入中可将标志位sync使能,这样会使写操作直到数据写入非易失存储后才返回。(在采用了Posix的系统中,写操作返回前调用fsync(), fdatasync(),msync(…,MS_SYNC))。
[cpp]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
leveldb::WriteOptions write_options;
write_options.sync = true;
db->Put(write_options, ...);
Caffe代码导读(3):LevelDB例程 - 卜居 - 博客频道 - CSDN.NET http://blog.csdn.net/kkk584520/article/details/41056783
Caffe自带例子Cifar10中使用leveldb存储输入数据,为此我们研究一下怎样使用它。安装步骤可以参考http://blog.csdn.net/kangqing2003/article/details/6658345
Leveldb库提供了一种持续的键值对存储方式。键和值可以为任意字节数组。键存储顺序可由用户定义的比较函数决定。
打开一个数据库
Leveldb数据库有个与文件系统目录相对应的名字。数据库的所有内容都保存在这个目录中。下面例子展示了怎样打开一个数据库,必要时创建它:
[cpp]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
#include <assert>
#include "leveldb/db.h"
leveldb::DB* db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options,"/tmp/testdb", &db);
assert(status.ok());
#include <assert> #include "leveldb/db.h" leveldb::DB* db; leveldb::Options options; options.create_if_missing = true; leveldb::Status status = leveldb::DB::Open(options,"/tmp/testdb", &db); assert(status.ok());
如果你想在数据库已经存在情况下报错,只需要在leveldb::DB::Open调用前增加以下代码
[cpp]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
options.error_if_exists = true;
options.error_if_exists = true;
状态
你可能注意到了上面的leveldb::Status类型。Leveldb中大多数可能遇到错误的函数返回该类型的值。你可以检查返回值是否为ok,必要时可打印相应的错误信息:
[cpp]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
leveldb::Status s = ...;
if(!s.ok()) cerr << s.ToString() << endl;
leveldb::Status s = ...; if(!s.ok()) cerr << s.ToString() << endl;
关闭数据库
当你操作完一个数据库,只需delete掉数据库对象。例子:
[cpp]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
...open the db as described above ...
... dosomething with db ...
deletedb;
...open the db as described above ... ... dosomething with db ... deletedb;
读和写
数据库提供Put,Delete和Get方法来修改/检索数据库。例如,下面代码将key1键下的值value移动到key2键下:
[cpp]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
std::string value;
leveldb::Status s = db->Get(leveldb::ReadOptions(), key1,&value);
if(s.ok()) s = db->Put(leveldb::WriteOptions(), key2, value);
if(s.ok()) s = db->Delete(leveldb::WriteOptions(), key1);
std::string value; leveldb::Status s = db->Get(leveldb::ReadOptions(), key1,&value); if(s.ok()) s = db->Put(leveldb::WriteOptions(), key2, value); if(s.ok()) s = db->Delete(leveldb::WriteOptions(), key1);
原子更新
注意到如果进程在key2 Put操作后、key1 delete操作前终止,那么相同的值value可能留存在多个键下。这类问题可以使用WriteBatch类避免,该类可以原子地应用一系列更新:
[cpp]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
#include "leveldb/write_batch.h"
...
std::string value;
leveldb::Status s = db->Get(leveldb::ReadOptions(), key1,&value);
if(s.ok()) {
leveldb::WriteBatch batch;
batch.Delete(key1);
batch.Put(key2, value);
s =db->Write(leveldb::WriteOptions(), &batch);
}
#include "leveldb/write_batch.h" ... std::string value; leveldb::Status s = db->Get(leveldb::ReadOptions(), key1,&value); if(s.ok()) { leveldb::WriteBatch batch; batch.Delete(key1); batch.Put(key2, value); s =db->Write(leveldb::WriteOptions(), &batch); }
WriteBatch持有一系列针对数据库的编辑操作,这些操作将在一个batch内顺序执行。注意到我们在Put前调用Delete,这样如果key1恰好等于key2时,最终我们不会错误地丢掉整个value。
除了原子操作的优点,WriteBatch也可以用于加速批量更新操作,只需要将大量独立的改动操作放到同一个batch中。
同步写
默认情况下,每次写到leveldb都是异步的:进程一旦将写操作推送给操作系统就返回。操作系统内存到非易失存储的传输将异步发生。在某次写入中可将标志位sync使能,这样会使写操作直到数据写入非易失存储后才返回。(在采用了Posix的系统中,写操作返回前调用fsync(), fdatasync(),msync(…,MS_SYNC))。
[cpp]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
leveldb::WriteOptions write_options;
write_options.sync = true;
db->Put(write_options, ...);
leveldb::WriteOptions write_options; write_options.sync = true; db->Put(write_options, ...);
相关文章推荐
- Caffe代码导读(2):LMDB简介
- JavaScript自学笔记(必看篇)
- js实现两个单选按钮,选不同的选项弹出显示不同的下拉框
- js获取项目根路径
- Caffe代码导读(1):Protobuf例子
- JS刷新当前页面的几种方法总结
- Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
- js 弹出子页面与关闭子页面刷新父页面的问题
- json简介
- Caffe代码导读(0):路线图
- 基于nodejs和activeMQ的消息推送
- Extjs tree树的方法和配置项
- swiper的基础使用(七)
- Sublime Less 自动编译成css
- HTML Button.onclick 事件汇总
- JS使用JSON作为参数实例分析
- jquery插件网址
- 基于jQuery上传文件插件
- JSR303中的来验证数据信息
- 浅析Bootstrap表格的使用