boost shared_memory_对象是否在磁盘中存储内容?

boost shared_memory_对象是否在磁盘中存储内容?,boost,interprocess,boost-interprocess,Boost,Interprocess,Boost Interprocess,我正在训练基于单个数据库的多个网络 所以为了加快速度和减少磁盘读取,我使用了boost提供的共享内存对象类。由于实验室工作站目前不可用,我将代码迁移到我的个人计算机上 在实验室工作站上,主机程序成功地将所有数据读取到内存中。但奇怪的是,在我的电脑上,它在系统驱动器上创建了一个文件,而不是将数据存储在内存中。整个数据库约为3.7GB;实验室工作站有32 GB内存,运行Windows Server 2008 R2;我的电脑有8 GB内存,运行Windows 7 应该有足够的内存来存储数据。那为什么呢

我正在训练基于单个数据库的多个网络

所以为了加快速度和减少磁盘读取,我使用了boost提供的共享内存对象类。由于实验室工作站目前不可用,我将代码迁移到我的个人计算机上

在实验室工作站上,主机程序成功地将所有数据读取到内存中。但奇怪的是,在我的电脑上,它在系统驱动器上创建了一个文件,而不是将数据存储在内存中。整个数据库约为3.7GB;实验室工作站有32 GB内存,运行Windows Server 2008 R2;我的电脑有8 GB内存,运行Windows 7


应该有足够的内存来存储数据。那为什么呢?是否有某些方法强制程序将所有数据保留在内存中?

即使用内存映射文件作为共享内存的备份,因此任何一台计算机的磁盘上都需要一个物理文件。操作系统仍然对该文件的内容进行大量缓存,因此,如果有可用空间,它实际上可能仍然能够将其完全缓存在RAM中

如果您不喜欢查看磁盘上实际存在的文件名,则可以尝试
相反它将使用系统交换文件中的空间作为共享内存的备份。

但是为什么Win 7和Server 08之间的行为有所不同?在服务器08上,没有这样的物理文件。我实际上没有在Win32上使用共享内存对象,所以我无法确认行为上的差异。但是,如果您没有在提供给shared_memory_对象的文件名中指定绝对路径,则可能是在服务器08上创建了一个文件,但它只是位于意外的目录中。您还可以使用SysInternals的processexplorer来查看它是否确实在某个地方有一个意外的打开文件句柄。