加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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的数据,但希望这能为您提供证明它的工具.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读