cpp快速访问磁盘上的二进制数据

时间:2012-06-03 18:16:05

标签: c++ database binary indexing

目前,我的程序在内存中有很多会话。 Session是unsigned int ID的对象,一些变量+可能的长大小std::map(会话与会话的大小不同)。

我想将一些会话卸载到磁盘,但不知道如何在磁盘上组织结构,以便有机会在磁盘上快速查找会话以在需要时加载它。如何通过磁盘上的ID快速查找会话?也许是一些索引,但不知道如何使用它们......或者可能是一些额外的变量?

* SQL数据库* 不是我的变体,因为稳定性,资源过度使用,可移植性,兼容性等等需要组织像磁盘上其他数据库那样的东西。

谢谢,对不起我的英语。如果有错误,请编辑我的文字

3 个答案:

答案 0 :(得分:6)

使用数据库,这正是它们的好处。

答案 1 :(得分:6)

您可以将SQLite库用于此目的。它也有C/C++ interface

此外,SQLite是一个cross-platform and portable数据库。它只是一个文件(您可以拥有单个文件),就像硬盘上的任何其他文件一样。您不需要为此安装任何大型软件。它轻巧方便。

答案 2 :(得分:2)

为什么在如此多的网站上这么多人回答一个简单的问题:“你为什么要那样做?”或提供不回答此人的替代方案? (阅读本页底部的“你的答案”框)可能有更好的方法,或者这个人几乎浪费时间。但是,他们可能只是为了尝试和提出解决方案的乐趣,无论它的功能如何。 @abrahab显然想要这样做(并且他试图让它变得非常清楚)所以让他,回答他的问题,或者如果你不知道答案保持安静。

@abrahab,一种方法是使用二进制文件格式来存储会话数据。对于保存在单独文件中的会话ID(Google btree)使用btree索引,存储在每个会话ID下的btree中的值是指向数据文件中二进制记录开始位置的文件指针。从文件中读取的第一个字节(short int,int,long)告诉您记录的长度(以字节为单位),读取这些字节并处理它们。由你来定义会话记录的格式(struct,等等)。如果编辑/删除/插入记录,则必须更新该记录的btree以及重新定位在数据文件中的任何记录。

使用数据库更容易,但如果这是您想要做的,这将起作用并且性能应该非常好。如果你想在记录中搜索特定的值,你可以用这些值构建另一个btree,但是那时要认真考虑下去DB路径。