我有一段时间没有做C++了,对于以下最佳实现方法我有些生疏:
我们有一个数据库,存储大量的“对象”。 我正在考虑一种方法来将所有这些对象的完整列表加载到内存中,但由于这些对象的大小和数量,实际上将它们全部放在内存中是不可行的。 相反,我想要一个“内存映射文件”系统,在访问时按需加载对象。 换句话说,让操作系统或类似的东西管理应该在内存中的对象,类似于操作系统决定哪些文件段应分页到内存中。 有人能给我提示如何实现吗?
提醒一下 - 如果您有大量存储在 SQL 表中的对象想要任意加载到内存中,那么它很可能会在多个方面变慢:对数据库的访问次数过多(尝试使用最少的查询),太多的构造函数调用(使用内存池)等等...
...但是您需要逐步进行 - 首先看看是否可以将 SQL 中的记录读入已实例化的对象中。最佳速度优化将在您组织数据以最小化对 DB 的访问和最小化构造函数调用方面。
请注意,内存映射解决方案将代替 SQL 表 - 它将更快,但比 SQL 不够灵活,并且您将面临双重维护的问题:SQL 中的数据必须与您的内存映射文件保持同步。
因此,根据您的对象大小,您可以将它们存储在哈希映射中,该映射保留LRU列表并开始将对象逐出到文件,同时在映射中保留键和文件偏移量。这样,当您确实需要从磁盘上拉回它们时,只需进行一次搜索和读取即可获取对象。如果您想要预分配固定大小的文件,则可以将它们映射到内存中,您的偏移量将成为另一个指针。
这是Riak数据库初始存储方式的简化版本,他们在网站[1][2]上有一些设计文档。仅当您的对象大于键,以便所有键都可以轻松地放入内存中,但对象不行时,才能发挥最佳效果。
Cassandra数据库使用类似其“键缓存”的技术[3]。
您还可以查看类似Berkly DB的本地存储解决方案。
[1] : http://wiki.basho.com/Concepts.html#Data-Storage
CreateFile()
、CreateFileMapping()
和MapViewOfFile()
函数。 - Remy Lebeau