首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免Ruby中的内存泄漏

如何避免Ruby中的内存泄漏
EN

Stack Overflow用户
提问于 2016-11-26 07:25:36
回答 1查看 996关注 0票数 0

我注意到,有时我的ruby脚本在处理小数据崩溃时运行得相当好,这是因为当您给它们一个大的数据集处理时,没有剩下的内存。例如,我有一个很长的脚本,它每增加一分钟就会有大约100兆的内存使用量,直到当我给它足够大的数据进行处理时,它就崩溃了。

所以,问题是,如何避免红宝石的内存泄漏,做什么和不做什么?对于长期运行的脚本,有什么提示和提示可以优化红宝石内存的使用吗?

如何确保我的红宝石脚本没有泄漏任何记忆?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-26 21:23:15

对内存问题的快速修正通常是增加对GC.start的调用,这种强制启动垃圾回收器。有时候Ruby会非常懒惰地清理垃圾,而且它会积累到一个危险的程度。

有时候,你会无意中创造出很难清理的结构,这是一种相互关联的东西,如果分析得更深入一些,而不是被保留下来。这使得垃圾收集器的生活更加艰难。例如,具有大量和大量字符串的Hash结构的深度哈希比简单的Array需要更多的工作来解放。

如果您有内存问题,您需要注意在执行操作时产生了多少垃圾。寻找折叠物的方法移除中间产品。例如,典型的例子是:

代码语言:javascript
复制
s = ''

10.times do |i|
  s += i.to_s
end

这将创建表单01234...的一个字符串作为最终产品,但它也会使用中间产品创建另外10个字符串。这是这个解决方案的11倍垃圾:

代码语言:javascript
复制
s = ''
10.times do |i|
  s << i.to_s
end

它创建单个字符串并多次追加到它。从技术上讲,数字上的to_s操作也会产生垃圾,所以这也是另一件要记住的事情,即转换不是免费的。这就是为什么在Ruby中经常看到像:name这样的符号,只需支付一次和一次的费用。每个字符串"name"都可以是一个独立的对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40816014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档