Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当应用程序需要更多RAM时,如何允许将内存段交换到磁盘?_C++_Windows_Memory Management_File Mapping - Fatal编程技术网

C++ 当应用程序需要更多RAM时,如何允许将内存段交换到磁盘?

C++ 当应用程序需要更多RAM时,如何允许将内存段交换到磁盘?,c++,windows,memory-management,file-mapping,C++,Windows,Memory Management,File Mapping,我有一个很大的值矩阵,它占用了大约2GB的RAM 我需要形成这个矩阵的副本,然后原始的可以交换到磁盘,稍后加载。该矩阵的内容很重要。最初计算它是昂贵的,所以你不能轻易地扔掉它并重新创建它。将矩阵放到磁盘上,然后从磁盘重新加载,比从头开始重新计算要快 是否有一种比我现有的更简单或更好的方法来指定一段内存暂时放在磁盘上,直到下次访问,即: 不需要资源(2GB矩阵)时 打开一个文件 将文件写入磁盘 释放内存 当需要资源时 打开文件 读入矩阵 从磁盘删除文件 我遇到过,但我不确定这是正确的使用方

我有一个很大的值矩阵,它占用了大约2GB的RAM

我需要形成这个矩阵的副本,然后原始的可以交换到磁盘,稍后加载。该矩阵的内容很重要。最初计算它是昂贵的,所以你不能轻易地扔掉它并重新创建它。将矩阵放到磁盘上,然后从磁盘重新加载,比从头开始重新计算要快

是否有一种比我现有的更简单或更好的方法来指定一段内存暂时放在磁盘上,直到下次访问,即:

不需要资源(2GB矩阵)时
  • 打开一个文件
  • 将文件写入磁盘
  • 释放内存
当需要资源时
  • 打开文件
  • 读入矩阵
  • 从磁盘删除文件
我遇到过,但我不确定这是正确的使用方法。请看一看

内存映射文件(MMF)提供了一种独特的内存管理功能,允许应用程序 以通过指针访问动态内存的相同方式访问磁盘上的文件


操作系统将非常有效地将原始矩阵的一部分交换到磁盘或从磁盘交换出去。

假设矩阵不需要在程序重新启动后继续运行,则将应用程序编译为64位,并将矩阵保留在内存中。在内存压力下,操作系统将自动调出使用最少的内存页

然而,即使是在一个稍微现代的硬件上,您也将拥有远远超过2+2 GB1的RAM,而且很有可能所有的东西都会留在RAM中


1原始矩阵+副本。

矩阵是否需要在程序重新启动后继续运行?显然,您使用的是64位操作系统。它已经非常擅长于计算虚拟内存映射的某些部分何时处于冷态,并且可以在不降低程序速度的情况下进行交换。在矩阵上执行的大多数操作都会涉及所有页面,乘法是常见的操作。试图帮助只会让事情变慢。如果矩阵是稀疏的,那么你确实有选项,问题中没有指出。@HansPassant:我的理解是,他正在对副本执行操作,可能保留原始副本,以便在执行下一组计算时初始化新副本。只有在执行复制时才可能接触原始文件,而副本可能会被频繁和广泛地访问。不,矩阵不需要在程序重新启动后继续存在。虽然这似乎是一个合理的建议,但当内存耗尽时,会发生的事是其他程序首先被切换出内存。结果是该程序对系统产生了非常负面的影响,因为当接近系统内存限制时,即使是windows资源管理器也会开始减速。最好将您知道不会使用的数据切换出去,以避免系统减速。@bobobo为什么最近使用过的其他程序的页面会在最近未使用过的此程序页面之前进行切换?我猜是因为“此”程序处于活动状态。相对而言,矩阵是最近创建的——这不是后台进程。@Bobo虚拟内存管理器不太关心哪个内存页属于哪个进程。当您复制矩阵时,页面将被调回内存,如果此进程或任何其他进程需要更多内存,则稍后将再次调出。请注意,进程不需要完全分页入/出-当您继续使用复制的矩阵时,操作系统可以自由地分页出原始矩阵,同时将副本保留在内存中。