gpt4 book ai didi

c++ - 在程序临时数组中使用内存映射文件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:26:29 25 4
gpt4 key购买 nike

我目前正在编写一个能够处理核心数据之外的程序。所以我处理的文件大小从 1MB 到 50GB(将来可能更大)。

我已经阅读了一些关于内存映射文件的教程,现在我正在使用内存映射文件来管理数据 IO,即从硬盘读取数据和向硬盘写入数据。

现在我还要处理数据,需要一些与数据大小相同的临时数组。我现在的问题是,是否我也应该为此使用内存映射文件,或者我是否应该以某种方式让操作系统管理它而不显式定义内存映射文件。问题如下:

我在多个平台上工作,但始终使用 64 位系统。理论上,64 位虚拟地址空间绝对可以满足我的需要。但是,在 Windows 中,最大虚拟地址空间似乎受到操作系统的限制,即用户可以设置是否允许分页以及允许的最大虚拟内存大小。我还在某处读到,Windows 64 中的最大虚拟内存不是 2^64,而是 2^40 或类似的地方,这对我来说仍然足够,但似乎是一个很奇怪的限制。此外,Windows 有一些奇怪的限制,例如数组的最大大小为 2^31 个元素,与数组类型无关。我不知道所有这些在 Linux 上是如何处理的,但我认为它的处理方式相似。大概允许的最大虚拟内存=OS-RAM+交换分区大小?因此,如果我想使用系统来处理超过 ram 大小的数据,就会遇到很多问题。我什至不知道我是否可以在 c++ 中以某种方式使用整个 64 位虚拟地址空间。在我的简短测试中,我遇到了一个编译器错误,无法初始化 mot than 2^31 个元素,但我认为,使用 std::vector 等可以很容易地超越它。

但是,另一方面,通过使用内存映射文件,我所有的内存写入操作都会将数据写入硬盘。特别是对于比我的物理 RAM 小的数据,这应该是一个相当大的瓶颈。或者它是否避免写入,直到它因为 RAM 超出而不得不写入???内存映射文件的优势出现在与共享内存或临时通信的进程间通信中,这样我就可以启动应用程序,写一些东西,退出应用程序,然后重新启动它,并只有效地将那些我需要的数据读取到 RAM 中。由于我需要处理整个数据并且只在一个执行实例中使用一个进程,所以这两个优点在我的案例中都没有出现。

注意:流式传输方法作为我的问题的替代解决方案并不真正可行,因为我严重依赖对数据的随机访问。

我理想中想要的是一种方法,我可以独立于它们的大小和操作限制设置限制来处理所有模型,但处理 RAM 中所有可能的内容,并且仅当超过物理限制时,才使用内存映射文件或用于调出超出数据的 RAM 的其他机制(如果有任何其他机制),最好由操作系统管理。

总而言之,处理这些临时现有数据的最佳方法是什么?如果我可以在没有内存映射文件和独立于平台的情况下做到这一点,你能给我任何代码片段或类似的东西并解释它是如何避免这些操作系统限制的吗?

最佳答案

由于没有人回答,我会自己更新问题的状态。

在我今天幸运地接触到 boost 进程间库之后,我发现了 managed_mapped_file,它甚至允许我在映射范围内分配 vector ,这使得它们几乎和没有映射文件的编程一样容易使用。

另外,我发现:

If several processes map the same file, and a process modifies a memory range from a mapped region that is also mapped by other process, the changes are inmedially visible to other processes. However, the file contents on disk are not updated immediately, since that would hurt performance (writing to disk is several times slower than writing to memory). If the user wants to make sure that file's contents have been updated, it can flush a range from the view to disk.

http://www.boost.org/doc/libs/1_54_0/doc/html/interprocess/sharedmemorybetweenprocesses.html

希望它只在我超过系统物理 RAM 时才开始写入。我还没有进行任何速度测量,并且可能不会进行其中一些测量。

我现在可以很好地接受这个解决方案。但是,我会将这个问题保留为未回答和打开的状态。在某些时候,有人可能会发现问题并可以提供更多提示,例如如何防止将数据刷新到实际需要的程度,或者有一些其他想法/提示如何处理核心数据之外的数据。

关于c++ - 在程序临时数组中使用内存映射文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18697858/

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