我有一个执行大量内存密集型工作的ruby脚本。由于内存不可用,脚本有时无法完成。幸运的是,有一种方法可以将脚本分成两部分,因为ruby脚本有两个部分。当我将脚本分成两个单独的脚本时,内存密集型工作也会分成2个。但现在我希望脚本2在脚本1之后执行。我打算编写一个类似于
的shell脚本ruby script1.rb
ruby script2.rb
我在这种方法中关注的是,由于两个脚本都安排在同一个shell脚本中,因此我们通过将ruby脚本分成2来实现内存崩溃是没有好处的。
如果script1.rb和script2.rb作为一个shell脚本运行,它们是否会在自己的内存空间中运行?如果script1.rb被终止,它会释放script2.rb可能使用的内存吗?将脚本拆分为两个并通过shell脚本运行它们听起来像是一个内存问题的方法吗?
答案 0 :(得分:2)
(我真的不懂Ruby,但我会试一试)
您的案例听起来好像:
你有一个Ruby脚本,由两部分组成,A和B
首先执行A并使用大量内存
当A完成后,它不会自行清理并留下大量无用对象的引用
之后执行B并使用更多的内存
B耗尽内存
通过将Ruby脚本拆分为两个脚本,您可以在终止时允许操作系统隐式释放A使用的内存。每个脚本都是一个新进程,只要它们不是并发执行(并行执行),它们就不会相互影响。
因此,使用shell脚本连续执行A和B允许B像A从未使用过任何内存那样工作,因此 是一种解决方法 - 非常难看。
由于你可以连续地运行A和B,你应该修复A以便它自己清理并释放任何内存。在对nil
完成A之后,设置对所有不需要的对象的所有引用,将允许Ruby垃圾收集器释放任何已用的内存。
最好的方法是完成Ruby脚本,并在完成该对象后立即将对象引用设置为nil
,而不是在最后执行此操作。您可能会发现您的脚本在之后显着减少了内存使用量。
保持对不必要对象的引用是一种内存泄漏形式,可能导致程序使用过多的内存。由于添加但从未移除的对象而无限增长的列表和树是这种情况的常见原因。这也可以显着降低代码的性能,因为解析树和 - 尤其是 - 列表随着它们变大而变慢。
一个好的心理测试是:“我的算法在纸上需要多少内存吗?”