Потребление памяти сценарием оболочки - PullRequest
0 голосов
/ 24 декабря 2010

У меня есть скрипт ruby, который выполняет много работы с большим объемом памяти.Скрипт иногда не завершается из-за недоступности памяти.К счастью, есть способ разделить скрипт на две части, так как в скрипте ruby ​​есть буквально две части.Работа, интенсивно использующая память, также разбивается на 2, так как я делю сценарий на 2 отдельных сценария.Но теперь я хочу, чтобы сценарий 2 выполнялся после сценария 1. Я намереваюсь написать сценарий оболочки, который выглядит примерно так:

ruby script1.rb
ruby script2.rb

Что меня беспокоит в этом подходе, так это то, что оба сценария запланированы втот же сценарий оболочки, который не поможет распределению памяти, которого мы пытаемся достичь, разделив сценарий ruby ​​на 2.

Будут ли скрипт script1.rb и script2.rb работать в своем собственном пространстве памяти, если они запустятсякак один сценарий оболочки?И если script1.rb завершается, освободит ли он память, которую может использовать script2.rb?Разве разделение сценариев на две части и запуск их через сценарий оболочки звучит как подход к проблеме с памятью?

1 Ответ

2 голосов
/ 24 декабря 2010

(я действительно не знаю Ruby, но я попробую)

Ваш случай звучит так:

  • У вас есть скрипт на Rubyкоторый состоит из двух частей, A и B

  • A выполняется первым и использует много памяти

  • Когда A завершает работу, он не очищаетсяпосле себя и оставляет множество ссылок на бесполезные объекты

  • B выполняется впоследствии и использует еще больше памяти

  • B не хватает памяти

Разбивая сценарий Ruby на два сценария, вы позволяете операционной системе неявно освобождать память, когда она завершается.Каждый сценарий - это новый процесс, и, пока они не выполняются одновременно (параллельно), они не влияют друг на друга.

Следовательно, использование сценария оболочки для последовательного выполнения A и B позволяет B работать какесли A никогда не использовал какую-либо память, значит, - это обходной путь - очень уродливый.

Поскольку вы можете запускать A и B поочередно, вам следует исправить A, чтобы он очистилсяза собой и освобождает любую память.Установка всех ссылок на любой объект, который не нужен после выполнения A для nil, позволит сборщику мусора Ruby освободить всю использованную память.

Наилучшим подходом будет пройти через скрипт Ruby и установитьобъект ссылается на nil, как только вы закончите с этим объектом, а не сделаете это в конце.Впоследствии вы можете обнаружить, что ваш скрипт значительно уменьшил использование памяти.

Хранение ссылок на ненужные объекты - это одна из форм утечки памяти, которая может привести к тому, что программа использует чрезмерное количество памяти.Списки и деревья, которые растут бесконечно, из-за того, что объекты добавляются, но никогда не удаляются, являются очень распространенной причиной этого.Это также может значительно снизить производительность кода, так как синтаксический анализ деревьев и - особенно - списков происходит медленнее по мере их увеличения.

Хороший мысленный тест: «Нужно ли моему алгоритму столько памяти на бумаге?»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...