将对象交换到文件

时间:2012-08-23 11:09:41

标签: c++ windows mapping swap disk

由于从数据库中检索到大量数据,我的C ++应用程序偶尔会耗尽内存。它必须在32位WinXP机器上运行。

是否可以透明地(对于大多数现有代码)将数据对象交换到磁盘并仅在需要时将其读入内存,所以我不限于2GB 那32bit Windows为流程提供了什么?

我看过VirtualAllocAddress Window Extensions,但我不确定这是我想要的。

我还发现了this SO question,其中提问者创建了一个文件映射,并希望在那里创建对象。一个答案建议使用placement new,这听起来对代码的其余部分非常透明。

这会阻止我的应用程序耗尽物理内存吗?我不完全确定它,因为毕竟还有32位地址空间限制。或者这是在尝试创建大量对象时会出现的另一类问题?

1 个答案:

答案 0 :(得分:1)

只要您使用的是32位操作系统,就无法对此做任何事情。虚拟内存中的数据无法超过3GB(在Windows情况下为2GB),无论它是否实际交换到磁盘。

历史上,数据库始终通过使用读取,写入和搜索来处理此问题。因此,它们不是直接从内存访问数据,而是使用伪(64位)指针。数据被分成块(通常约为4kb),并且这些块中的许多块被分配在存储器中。当他们想要从伪指针地址访问数据时,他们会检查块是否已加载到内存中,如果是,则从那里访问它。如果不是,那么他们找到一个空槽并将其复制,然后返回地址。如果没有空闲的插槽,那么一段数据将被写回磁盘(如果它被修改)并且该插槽将被重用。

真正的美妙之处在于,如果你的系统有足够的RAM,那么操作系统会在任何时间点在RAM中缓存超过2GB的这些数据,当你觉得你实际上是在从磁盘读写时操作系统可能只是在内存中复制数据。当然,这需要一个支持3GB以上物理内存的32位操作系统,例如Linux或带有PAE的Windows Server。

SQLite有一个很好的自包含implementation of this,您可以轻松地使用它。

如果您不希望这样做,那么您唯一的选择就是使用64位操作系统或在任何给定时间点使用较少的数据。