gpt4 book ai didi

c++ - 将对象交换到文件

转载 作者:可可西里 更新时间:2023-11-01 10:38:29 25 4
gpt4 key购买 nike

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

是否可以透明地(对于大多数现有代码)将数据对象换出到磁盘并仅在需要时将它们读入内存,所以我不限于 32 位的 2GB Windows给进程?

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

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

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

最佳答案

只要您使用的是 32 位操作系统,您就无能为力。虚拟内存中的数据不能超过 3GB(在 Windows 中为 2GB),无论它是否实际换出到磁盘。

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

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

SQLite 有一个很好的自包含 implementation of this ,您可能可以毫不费力地使用它。

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

关于c++ - 将对象交换到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12090245/

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