Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/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
Ruby Errno::ENOMEM在使用交换时处理外壳输出_Ruby_Linux_Shell_Memory - Fatal编程技术网

Ruby Errno::ENOMEM在使用交换时处理外壳输出

Ruby Errno::ENOMEM在使用交换时处理外壳输出,ruby,linux,shell,memory,Ruby,Linux,Shell,Memory,我有一个ruby脚本,它在内存中加载了大量数据,然后需要对这些数据执行一项任务。但有时,数据太大,以至于脚本在交换中运行,在这种情况下,剥离会给我一个Errno::ENOMEM错误 以下是重现问题的脚本: def current_process_ram pid, size = `ps ax -o pid,rss | grep -E "^[[:space:]]*#{$$}"`.strip.split.map(&:to_i) size / 1000 end def display_

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

以下是重现问题的脚本:

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
它运行在Ubuntu服务器“trusty tahr”虚拟机上

我的问题 为什么会出现
Errno::ENOMEM
错误?我希望系统调用能够工作,因为我有足够的交换来执行它


编辑:如果我将脚本更改为仅使用1 gig,则在炮击时不会爆炸

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

编辑3:澄清我的问题

为什么会出现Errno::ENOMEM错误

因为Ruby无法分配足够的内存

当你使用典型的Ruby时,Ruby的内存管理是困难的(IMHO)

这里有一篇文章可以帮助您:

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

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


那么,你的问题是什么???@maxd我更新了帖子,澄清了我的问题。谢谢。至少现在我明白了这种行为。我将尝试posix繁殖。谢谢!
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>'