Rol*_*sen 7 c++ database windows paging memory-management
我有一个应用程序,使用数据库中每个表的stl-map在内存中实现整个数据库.
stl-map中的每个项都是一个复杂的对象,引用其他stl-maps中的其他项.
该应用程序使用大量数据,因此它使用超过500 MB的RAM.客户端可以联系应用程序并获取整个数据库的筛选版本.这是通过遍历整个数据库并查找与客户端相关的项目来完成的.
当应用程序运行一个小时左右时,Windows 2003 SP2开始为应用程序分页RAM的部分内容(尽管机器上有16 GB的RAM).
部分页面调度应用程序后,客户端登录需要很长时间(10分钟),因为它现在为stl-map中的每个指针查找生成页面错误.如果在此之后第二次运行客户端登录,则它很快(几秒),因为所有内存现在都回到RAM中.
我可以看到有可能告诉Windows将内存锁定在RAM中,但这通常仅建议用于设备驱动程序,并且仅用于"小"内存量.
我想一个糟糕的勒芒解决方案可能是遍历整个内存数据库,因此告诉Windows我们仍然有兴趣将数据模型保存在RAM中.
我想另一个糟糕的解决方案可能是在Windows上完全禁用页面文件.
我想昂贵的解决方案是SQL数据库,然后重写整个应用程序以使用数据库层.然后希望数据库系统将实现快速访问的手段.
还有其他更优雅的解决方案吗?
这听起来像是内存泄漏或严重的碎片问题.在我看来,第一步是弄清楚是什么导致500 Mb的数据耗尽16 Gb的RAM并仍然需要更多.
编辑:Windows有一个工作集修剪器,主动尝试分页空闲数据.基本思想是它通过并将页面标记为可用,但将数据保留在其中(并且虚拟内存管理器知道它们中的数据).但是,如果您在将内存分配给其他用途之前尝试访问该内存,则会将其标记为再次使用,这通常会阻止其被分页.
如果您真的认为这是问题的根源,您可以通过调用间接控制工作集修剪器SetProcessWorkingSetSize
.至少根据我的经验,这很少用,但你可能处于其中一个非常有用的特殊情况.