我注意到,有时我的ruby脚本在处理小数据崩溃时运行得相当好,这是因为当您给它们一个大的数据集处理时,没有剩下的内存。例如,我有一个很长的脚本,它每增加一分钟就会有大约100兆的内存使用量,直到当我给它足够大的数据进行处理时,它就崩溃了。
所以,问题是,如何避免红宝石的内存泄漏,做什么和不做什么?对于长期运行的脚本,有什么提示和提示可以优化红宝石内存的使用吗?
如何确保我的红宝石脚本没有泄漏任何记忆?
谢谢!
发布于 2016-11-26 21:23:15
对内存问题的快速修正通常是增加对GC.start的调用,这种强制启动垃圾回收器。有时候Ruby会非常懒惰地清理垃圾,而且它会积累到一个危险的程度。
有时候,你会无意中创造出很难清理的结构,这是一种相互关联的东西,如果分析得更深入一些,而不是被保留下来。这使得垃圾收集器的生活更加艰难。例如,具有大量和大量字符串的Hash结构的深度哈希比简单的Array需要更多的工作来解放。
如果您有内存问题,您需要注意在执行操作时产生了多少垃圾。寻找折叠物的方法移除中间产品。例如,典型的例子是:
s = ''
10.times do |i|
s += i.to_s
end这将创建表单01234...的一个字符串作为最终产品,但它也会使用中间产品创建另外10个字符串。这是这个解决方案的11倍垃圾:
s = ''
10.times do |i|
s << i.to_s
end它创建单个字符串并多次追加到它。从技术上讲,数字上的to_s操作也会产生垃圾,所以这也是另一件要记住的事情,即转换不是免费的。这就是为什么在Ruby中经常看到像:name这样的符号,只需支付一次和一次的费用。每个字符串"name"都可以是一个独立的对象。
https://stackoverflow.com/questions/40816014
复制相似问题