我最近也碰到类似的应用场景。选的是 lmdb. 它是基于 mmap 的 kv 数据库。
我弄的 qtng 提供了一个类似于 std::map<> 的包装。
//github/hgoldfish/qtnetworkng/blob/master/include/lmdb.h#L107
auto lmdb = Lmdb::Builder(dbPath).create();
auto trans = lmdb->toWrite();
auto db = trans->db("test");
db.insert(...);
db.remove(...);
db.value(...);
for (db::iterator itor = db.begin(); itor != db.end(); ++itor) {
cout << itor.key() << itor.value() << endl;
}
跟操作内存中的 map<> 没太大区别。有两种配置 writeMap(true) 和 writeMap(false) 前者所有写入直接写到 mmap 内存里面,但映射文件会被固定到某个大小。而后者先写到内存,等 sync() 的时候才合并到 mmap 内存里面,所以映射文件不会特别大。前者还可以配置 noSync(true),此时,写入到 mmap 内存后,会在后台慢慢刷到磁盘。这个写速度暴快。
但注意,lmdb 只允许串行写入,不能多线程写同一个事务。它适用于读特别多,但是写较少的场景。
【 在 cat201702 的大作中提到: 】
: 这样一种场景:实时数据流希望把所有数据都存下来,总数据量未知可能有几G,也可能有几十上百G;C++中有没有好用的方便读写mmap库能动态扩展(如多个文件每个文件固定大小),找了一圈好像没有。
: 就是一个进程通过这个mmap库实时存储未知大小的数据, 另一个进程(也可能多个进程)通过mmap实时读取这个数据。
--
修改:hgoldfish FROM 117.28.128.*
FROM 117.28.128.*