gpt4 book ai didi

Ruby 大数组和内存

转载 作者:数据小太阳 更新时间:2023-10-29 07:26:05 24 4
gpt4 key购买 nike

我创建了一个大数组 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,但是分配的内存并没有改变,直到我终止了进程。我需要做些什么来从内存中删除分配给 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,放置在 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 的数据,但希望这能为您提供证明这一点的工具。

关于Ruby 大数组和内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11912750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com