簡體   English   中英

Shell腳本內存消耗

[英]Shell script memory consumption

我有一個ruby腳本,執行大量內存密集型工作。 由於內存不可用,腳本有時無法完成。 幸運的是,有一種方法可以將腳本分為兩部分,因為Ruby腳本實際上有兩部分。 當我將腳本分為2個單獨的腳本時,占用大量內存的工作也分為2個。 但是現在我希望腳本2在腳本1之后執行。我打算編寫一個外殼腳本,其外觀類似於

ruby script1.rb
ruby script2.rb

我在這種方法中擔心的是,由於這兩個腳本是在同一個Shell腳本中調度的,因此這對於將ruby腳本拆分為2來實現的內存分解無濟於事。

如果將script1.rb和script2.rb作為一個shell腳本運行,它們是否會在自己的內存空間中運行? 並且如果script1.rb被終止,是否可以釋放script2.rb可能利用的內存? 將腳本拆分為兩個並通過shell腳本運行是否聽起來像解決內存問題的方法?

(我真的不懂Ruby,但我會試一試)

您的案例聽起來好像:

  • 你有一個Ruby腳本,由兩部分組成,A和B.

  • 首先執行A並使用大量內存

  • 當A完成后,它不會自行清理並留下大量對無用物體的引用

  • 之后執行B並使用更多的內存

  • B內存不足

通過將Ruby腳本拆分為兩個腳本,您可以在終止時允許操作系統隱式釋放A使用的內存。 每個腳本都是一個新進程,只要它們不是並發執行(並行執行),它們就不會相互影響。

因此,使用shell腳本連續執行A和B可以使B像A從未使用過任何內存一樣工作,因此這一種解決方法-非常丑陋。

由於你可以連續地運行A和B,你應該修復A以便它自己清理並釋放任何內存。 設置為做是為了以后不需要任何對象的所有引用nil ,將允許Ruby的垃圾回收器釋放所有使用的內存。

最好的方法是使用Ruby腳本,並在處理完對象后立即將對象引用設置為nil ,而不是在最后完成。 您可能會發現您的腳本后來顯着減少了內存使用量。

保留對不必要對象的引用是一種內存泄漏形式,可能導致程序使用過多的內存。 由於添加但從未移除的對象而無限增長的列表和樹是這種情況的常見原因。 這也可以顯着降低代碼的性能,因為解析樹和 - 特別是 - 列表隨着它們變大而變慢。

一個好的心理測試是:“我的算法在紙上需要多少內存嗎?”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM