gpt4 book ai didi

c++ - 如何优化大型内存数据库的分页

转载 作者:可可西里 更新时间:2023-11-01 13:10:23 32 4
gpt4 key购买 nike

我有一个应用程序,其中整个数据库在内存中使用数据库中每个表的 STL-map 实现。

STL-map 中的每个项目都是一个复杂的对象,引用了其他 STL-map 中的其他项目。

该应用程序处理大量数据,因此使用了 500 多兆字节的 RAM。客户能够联系应用程序并获得整个数据库的过滤版本。这是通过运行整个数据库并查找与客户相关的项目来完成的。

当应用程序运行一个小时左右时,Windows 2003 SP2 开始为应用程序调出部分 RAM(即使机器上有 16 GByte RAM)。

应用程序被部分调出后,客户端登录需要很长时间(10 分钟),因为它现在会为 STL-map 中的每个指针查找生成页面错误。如果在之后第二次运行客户端登录,那么它会很快(几秒),因为所有内存现在都回到了 RAM 中。

我知道可以告诉 Windows 将内存锁定在 RAM 中,但这通常只推荐用于设备驱动程序,并且只推荐用于“少量”内存。

我想一个穷人的解决方案可能是遍历整个内存数据库,从而告诉 Windows 我们仍然有兴趣将数据模型保存在 RAM 中。

我想另一个穷人的解决方案可能是在 Windows 上完全禁用页面文件。

我猜昂贵的解决方案是 SQL 数据库,然后重写整个应用程序以使用数据库层。然后希望数据库系统能够实现快速访问的方法。

还有其他更优雅的解决方案吗?

最佳答案

听起来要么是内存泄漏,要么是严重的碎片问题。在我看来,第一步是弄清楚是什么导致 500 Mb 的数据用完了 16 Gb 的 RAM 并且仍然需要更多。

编辑:Windows 有一个工作集修剪器,它主动尝试调出空闲数据。基本思想是它遍历并将页面标记为可用,但将数据留在其中(并且虚拟内存管理器知道其中有什么数据)。但是,如果您在内存分配给其他用途之前尝试访问该内存,它将被标记为再次使用,这通常会阻止它被调出。

如果您真的认为这是问题的根源,您可以通过调用 SetProcessWorkingSetSize 间接控制工作集微调器。 .至少根据我的经验,这很少有用,但您可能处于其中一种非常有用的不寻常情况。

关于c++ - 如何优化大型内存数据库的分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2989961/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com