gpt4 book ai didi

c++ - 重载新运算符以将对象存储在 mmap 文件中

转载 作者:IT王子 更新时间:2023-10-29 01:25:01 27 4
gpt4 key购买 nike

我有一个需要相当大内存的 Linux C++ 程序。大部分内存只被几个类占用,而且访问频率相当低。我想将这些类从主内存移动到基于磁盘的存储,同时尽可能少地更改现有代码。

我们的想法是为这些对象覆盖new 运算符,并将它们分配到mmap() 的内存区域中。这样我的代码修改就非常有限,程序的其余部分可以愉快地访问这些对象而不知道有任何更改,内核将确保我需要的对象在内存中而其他对象在磁盘上。我知道这与交换的工作方式非常相似,但交换分区通常对于我的程序需要来说太小了。

我的一些问题:

  • 这是一个非常糟糕的主意吗?你知道更好的方法来实现同样的目标吗?
  • 我是否需要预先分配最大文件大小,我是否需要在磁盘上分配所有这些空间?如果是这样,映射到稀疏文件会有帮助吗?
  • 我不想自己写堆分配器。我可以使用现有的吗?
  • 当我的程序完成时,mmap 文件将被删除。这意味着我不希望将任何页面写入磁盘除非内核实际上会将它们从内存中删除。 mmap 是否有类似lazy 标志的东西来实现这一点,或者这是自动的?

最佳答案

依次看每个问题

  • 这是一个非常糟糕的主意吗?你知道更好的方法来实现同样的目标吗?

它不是很清楚你希望通过这个实现什么。 Linux 已经支持交换空间使用的内存(因此如果您的数据超过物理内存,一些将被交换到磁盘)。您是否遇到地址空间不足或由于过度分页导致运行缓慢的问题?使用 mmap 支持的存储不会真正影响任何一个。

  • 我是否需要预先分配最大文件大小,我是否需要在磁盘上分配所有这些空间?如果是这样,映射到稀疏文件会有帮助吗?

是的,您需要文件与您映射的空间一样大。但是,您可以从一个小文件/mmap 开始,然后根据需要增加文件(和 mmap 附加页面)。您还可以使用稀疏文件,以便在写入页面之前不使用磁盘空间。

  • 我不想编写自己的堆分配器。我可以使用现有的吗?

有些堆管理器使用 mmap 支持的存储。我见过 Doug Lea malloc 的版本,以及这样做的各种其他 bibop 分配器。

  • 当我的程序完成时,mmap 文件将被删除。这意味着我不希望将任何页面写入磁盘,除非内核实际上将它们从内存中删除。 mmap 是否有类似惰性标志的东西来实现这一点,或者这是自动的?

在这种情况下,您可以只使用 MAP_ANON 而根本没有文件。然而,这又回到了第一个问题,因为这实际上是在复制系统 malloc(和 new)所做的事情。事实上,在某些操作系统(Solaris?)上,这正是系统 malloc 所做的。我过去看到基于 mmap 的自定义 malloc 的主要原因是用于持久存储(因此文件将在进程退出后保留并在重新启动时重新映射)。

关于c++ - 重载新运算符以将对象存储在 mmap 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4674906/

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