Ruby大数组和内存
发布时间:2020-12-17 03:38:45 所属栏目:百科 来源:网络整理
导读:我创建了一个大数组a,其内存增长到~500 MB: a = []t = Thread.new do loop do sleep 1 print "#{a.size} " endend5_000_000.times do a [rand(36**10).to_s(36)]endputs "n size is #{a.size}"a = []t.join 之后,我“清除”了一个,但是在我杀死进程之前,分
我创建了一个大数组a,其内存增长到~500 MB:
a = [] t = Thread.new do loop do sleep 1 print "#{a.size} " end end 5_000_000.times do a << [rand(36**10).to_s(36)] end puts "n size is #{a.size}" a = [] t.join 之后,我“清除”了一个,但是在我杀死进程之前,分配的内存没有改变.我需要做些什么来删除从内存中分配给a的所有这些数据吗? 解决方法
如果我在代码的轻微修改版本上使用
Ruby Garbage Collection Profiler:
GC::Profiler.enable GC::Profiler.clear a = [] 5_000_000.times do a << [rand(36**10).to_s(36)] end puts "n size is #{a.size}" a = [] GC::Profiler.report 我得到以下输出(在Ruby 1.9.3上)(删除了一些列和行): GC 60 invokes. Index Invoke Time(sec) Use Size(byte) Total Size(byte) ... 1 0.109 131136 409200 ... 2 0.125 192528 409200 ... ... 58 33.484 199150344 260938656 ... 59 36.000 211394640 260955024 ... 配置文件以131 136个字节开头,以211 394 640字节结尾,在运行的任何地方都没有减小,我们可以假设没有发生垃圾收集. 如果我然后添加一行代码,将一个元素添加到数组a,放置在已经增长到500万个元素之后,然后分配一个空数组: GC::Profiler.enable GC::Profiler.clear a = [] 5_000_000.times do a << [rand(36**10).to_s(36)] end puts "n size is #{a.size}" a = [] # the only change is to add one element to the (now) empty array a a << [rand(36**10).to_s(36)] GC::Profiler.report 这会将探查器输出更改为(删除了一些列和行): GC 62 invokes. Index Invoke Time(sec) Use Size(byte) Total Size(byte) ... 1 0.156 131376 409200 ... 2 0.172 192792 409200 ... ... 59 35.375 211187736 260955024 ... 60 36.625 211395000 469679760 ... 61 41.891 2280168 307832976 ... 此分析器现在运行时使用的是131 376字节,与上一次运行类似,增长,但以2 280 168字节结尾使用,明显低于之前使用211 394 640字节结束的配置文件运行,我们可以假设垃圾收集在此运行期间发生,可能是由我们的新代码行引发的,该代码向a添加了一个元素. 简短的回答是否定的,您不需要做任何特殊的事情来删除分配给a的数据,但希望这能为您提供证明它的工具. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |