我在Google和此站点中搜索了我的问题,但我仍然不明白该解决方案。
我有一个MPI程序,它对一些数据进行RECV。程序在大型阵列上崩溃,并显示虚拟内存不足的错误,因此我开始考虑/proc/self/status文件。
在MPI_RECV之前是:
Name: model.exe
VmPeak: 841640 kB
VmSize: 841640 kB
VmHWM: 15100 kB
VmRSS: 15100 kB
VmData: 760692 kB
Name: model.exe
VmPeak: 841640 kB
VmSize: 841640 kB
VmHWM: 719980 kB
VmRSS: 719980 kB
VmData: 760692 kB
VmSize(和VmPeak)参数没有变化。VmRSS? (并且VmSize仅分配,但仍未使用的内存)
最佳答案
(可能的解决方案是最后一段)
在大多数具有虚拟内存的现代操作系统上,内存分配是一个分为两个阶段的过程。首先,保留了该进程的虚拟地址空间的一部分,并且相应地增加了该进程的虚拟内存大小(VmSize)。这将在所谓的过程页表中创建条目。页面最初不与物理存储帧相关联,即实际上没有使用物理存储。每当实际读取或写入此分配部分的某些部分时,就会发生页面错误,并且操作系统会从物理内存中安装(映射)空闲页面。这会增加进程的驻留集大小(VmRSS)。当某些其他进程需要内存时,OS可能会将一些不常用页面的内容(“不常用页面”的定义高度依赖于实现)存储到某些持久性存储中(在大多数情况下为硬盘驱动器,或者通常存储在交换设备中) ),然后取消映射。此过程减少了RSS,但保留了VmSize不变。如果以后访问此页面,将再次发生页面错误并将其带回。仅当释放虚拟内存分配时,虚拟内存大小才会减小。请注意,VmSize还计入内存映射文件(即可执行文件及其链接到的所有共享库或其他显式映射文件)和共享内存块。
进程中有两种通用的内存类型-静态分配的内存和堆内存。静态分配的内存保留所有常量和全局/静态变量。它是数据段的一部分,其大小由VmData指标显示。数据段还托管程序堆的一部分,其中分配了动态内存。数据段是连续的,即它从某个位置开始,然后朝着堆栈向上增长(堆栈从很高的地址开始,然后向下增长)。数据段中的堆的问题在于,它是由特殊的堆分配器管理的,该分配器负责将连续的数据段分割为较小的内存块。另一方面,在Linux中,还可以通过直接映射虚拟内存来分配动态内存。通常只对大型分配执行此操作以节省内存,因为它只允许分配页面大小倍数(通常为4 KiB)的内存。
堆栈也是占用大量内存的重要来源,尤其是在自动(堆栈)存储中分配了大阵列的情况下。堆栈从可用虚拟地址空间的最顶部开始,然后向下扩展。在某些情况下,它可能到达数据段的顶部,也可能到达其他虚拟分配的末尾。不幸的事情发生了。堆栈大小在VmStack指标以及VmSize中进行计算。
可以这样总结:
VmSize负责所有虚拟内存分配(文件映射,共享内存,堆内存,任何内存),并且几乎在每次分配新内存时都会增长。几乎,因为如果在数据段中用新的堆内存分配代替了释放的旧分配,则不会分配新的虚拟内存。每当释放虚拟分配时,它都会减少。 VmPeak跟踪VmSize的最大值-它只能随着时间增加。 VmRSS随着访问内存而增加,而随着内存被调出到交换设备而减少。 VmData随着使用堆的数据段部分而增长。由于当前的堆分配器会保留释放的内存,以防将来的分配需要它,它几乎永远不会收缩。 VmLck)。这是不允许分页的内存。它如何增长和缩小取决于MPI实现。有些人从未取消注册已注册的块(有关其原因的技术细节太复杂,无法在此处描述),其他人则这样做是为了更好地与虚拟内存管理器一起玩。ulimit机制施加人为限制的手段。在 shell 中运行ulimit -v会告诉您KiB中虚拟内存大小的限制是多少。您可以使用ulimit -v <value in KiB>设置限制。这仅适用于当前shell产生的进程及其子级,grandchilren等。如果要在远程节点上启动其他进程,则需要指示mpiexec(或mpirun)将此值传播给所有其他进程。如果在某些工作负载管理器(如LSF,Sun/Oracle Grid Engine,Torque/PBS等)的控制下运行程序,则有一些作业参数可控制虚拟内存大小限制。最后但并非最不重要的一点是,通常将32位进程限制为2 GiB的可用虚拟内存。
关于linux - 增加虚拟内存而不增加VmSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13308684/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p
这会导致Ruby出现内存问题吗?我知道如果大小超过10KB,Open-URI会写入TempFile。但是HTTParty会在写入TempFile之前尝试将整个PDF保存到内存吗?src=Tempfile.new("file.pdf")src.binmodesrc.writeHTTParty.get("large_file.pdf").parsed_response 最佳答案 您可以使用Net::HTTP。参见thedocumentation(特别是标题为“流媒体响应机构”的部分)。这是文档中的示例:uri=URI('http://e
我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.