首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Errno::ENOMEM当进程外壳在使用交换时

Errno::ENOMEM当进程外壳在使用交换时
EN

Stack Overflow用户
提问于 2015-05-13 15:21:14
回答 1查看 458关注 0票数 2

我有一个ruby脚本,它在内存中加载了大量数据,然后需要对这些数据执行任务。但是有时,数据太大了,以至于脚本在交换中运行,在这种情况下,退出会给我一个Errno::ENOMEM错误。

下面是重现问题的脚本:

代码语言:javascript
复制
def current_process_ram
  pid, size = `ps ax -o pid,rss | grep -E "^[[:space:]]*#{$$}"`.strip.split.map(&:to_i)
  size / 1000
end

def display_current_process_ram
  "Current RAM: #{current_process_ram}"
end

puts display_current_process_ram

array = []
one_gig = 14_000_000
0.upto(one_gig * 2.5) do
  array << '12345'
end
sleep 2
`ls`

puts display_current_process_ram

运行脚本之前的htop

当脚本运行时,htop

由此产生的错误:

代码语言:javascript
复制
deploy@vagrant-ubuntu-trusty-64:~/statusmachine$ ruby test.rb
Current RAM: 7
test.rb:19:in ``': Cannot allocate memory - ls (Errno::ENOMEM)
        from test.rb:19:in `<main>'

它运行在一个Ubuntu服务器“信任的tahr”VM上。

我的问题

为什么我会得到Errno::ENOMEM错误?我希望系统调用能够正常工作,因为我有足够的交换空间来执行它。

编辑:如果我把脚本改为只使用1G,它不会爆炸时,炮击。

编辑2:当我抛出时,仍然有大量的交换来执行系统调用,所以不应该发生Errno::ENOMEM

编辑3:澄清了我的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-13 16:02:14

为什么我会得到Errno::ENOMEM错误?

因为Ruby不能分配足够的内存。

当您使用典型的Ruby,即a.k.a时,Ruby的内存管理非常困难(IMHO)。KRI,MRI,YARV

以下是一篇可能对你有帮助的文章:

http://adamniedzielski.github.io/blog/2014/02/05/fighting-paperclip-errno-enomem-error/

本文的关键思想是:“要创建子进程,可用内存必须大于父进程占用的内存。”

本文的解决方案是切换到使用posix-spawn gem:

https://github.com/rtomayko/posix-spawn

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30219106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档