Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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组合两个数组会导致进程内存不足_Ruby_Arrays_Out Of Memory_Ruby 2.1 - Fatal编程技术网

Ruby组合两个数组会导致进程内存不足

Ruby组合两个数组会导致进程内存不足,ruby,arrays,out-of-memory,ruby-2.1,Ruby,Arrays,Out Of Memory,Ruby 2.1,组合两个哈希数组(每个哈希数组有100k个项)会导致运行在2GB虚拟机上的进程内存不足。我不明白怎么/为什么 假设我有一个这样的散列,我用50个键/值对填充它 h = {} 1..50.times{ h[SecureRandom.hex] = SecureRandom.hex} 我将100khs放入两个数组中,如下所示: a = [] a1 = [] 1..100_000.times{ a << h } 1..100_000.times{ a1 << h } 这两个阵

组合两个哈希数组(每个哈希数组有100k个项)会导致运行在2GB虚拟机上的进程内存不足。我不明白怎么/为什么

假设我有一个这样的散列,我用50个键/值对填充它

h = {}
1..50.times{ h[SecureRandom.hex] = SecureRandom.hex}
我将100k
h
s放入两个数组中,如下所示:

a = []
a1 = []
1..100_000.times{ a << h }
1..100_000.times{ a1 << h }
这两个阵列是否真的太大而无法在内存中合并?实现这一目标的首选方法是什么


我正在运行ruby 2.1.1p76(2014-02-24修订版45161)[x86_64-linux],虚拟机上没有其他进程运行。

问题很可能不是ruby在执行此操作时内存不足(特别是因为只有一个
h
哈希的副本),而是IRB在试图显示结果时内存不足。尝试添加一个
;IRB中最后一行之后为零;这将解决问题,因为它将阻止IRB尝试显示结果哈希

例如:

require 'securerandom'
require 'objspace'

h = {}
1..50.times{ h[SecureRandom.hex] = SecureRandom.hex}
a = []
a1 = []
1..100_000.times{ a << h }
1..100_000.times{ a1 << h }
a << a1; nil # Semicolon and nil are for IRB, not needed with regular Ruby

puts "Total memory usage: #{ObjectSpace.memsize_of_all/1000.0} KB"
需要“securerandom”
需要“objspace”
h={}
1..50.次{h[SecureRandom.hex]=SecureRandom.hex}
a=[]
a1=[]

1..100_000.times{a问题很可能不是Ruby在执行此操作时内存不足(特别是因为只有一个
h
hash副本),而是IRB在尝试显示结果时内存不足。请尝试在IRB中的最后一行后添加一个
;nil
;这应该可以解决问题,因为它将阻止IRB尝试显示结果哈希

例如:

require 'securerandom'
require 'objspace'

h = {}
1..50.times{ h[SecureRandom.hex] = SecureRandom.hex}
a = []
a1 = []
1..100_000.times{ a << h }
1..100_000.times{ a1 << h }
a << a1; nil # Semicolon and nil are for IRB, not needed with regular Ruby

puts "Total memory usage: #{ObjectSpace.memsize_of_all/1000.0} KB"
需要“securerandom”
需要“objspace”
h={}
1..50.次{h[SecureRandom.hex]=SecureRandom.hex}
a=[]
a1=[]


1..10万次{100k个项目?每个项目大约5000000个。50*100000=500万个。加入它们将产生一个1000万个项目数组。我使用1.72G的真实内存,OSX上Ruby 2.1.2上的4.87G虚拟内存来显示它。所以是的,完全有可能它的ram用完了。对我来说运行良好。值得注意的是,这些列表有100k个对同一哈希的引用。
a我可能缺少一些东西,但是-散列用随机键/值对填充了50次,然后将散列添加到每个数组中100k次,使两个数组都有100k项,其中每个项都是一个具有50K/v对的散列。否?@user1032752是的,引用使用的内存更少。我在评论中说了这一点。请尝试在后面添加分号r你的最后一句话,告诉IRB不要显示结果。10万个项目?每个项目大约500万个。50*100000=500万个。加入它们会产生一个1000万个项目数组。我用1.72克的真实内存,4.87克的虚拟内存在Ruby 2.1.2上在OSX上显示。所以是的,完全有可能内存不足。对我来说运行良好。值得注意那些列表对同一个散列有100K个引用。
a我可能缺少一些东西,但是-散列被随机键/值对填充了50次,然后该散列被添加到每个数组中100K次,形成两个数组,每个数组有100K个项,其中每个项都是一个有50k/v对的散列。否?@user1032752是的,引用使用较少的备注ry。我在评论中说过。试着在你的最后一句话后加一个分号,告诉IRB不要显示结果。再次感谢,我在排忧解难时问了这个问题——你认为你能帮上忙吗?可能是把列表本身呈现为字符串导致了内存故障。@tadman可能是。老实说,虽然我不确定。我所能做的就是指出你是调试的潜在资源。数组本身非常紧凑,只是引用,但用
inspect
将其扩展为字符串可能会非常痛苦。再次感谢,我在Troulbeshoot这个问题时问了这个问题--你认为你能帮上忙吗?可能是因为将列表本身呈现为s一个字符串导致了内存故障。@tadman可能是。老实说,虽然我不确定。我所能做的就是指出你是调试的潜在资源。数组本身非常紧凑,只是引用,但用
inspect
将其扩展为字符串可能会非常痛苦。