(я действительно не знаю Ruby, но я попробую)
Ваш случай звучит так:
У вас есть скрипт на Rubyкоторый состоит из двух частей, A и B
A выполняется первым и использует много памяти
Когда A завершает работу, он не очищаетсяпосле себя и оставляет множество ссылок на бесполезные объекты
B выполняется впоследствии и использует еще больше памяти
B не хватает памяти
Разбивая сценарий Ruby на два сценария, вы позволяете операционной системе неявно освобождать память, когда она завершается.Каждый сценарий - это новый процесс, и, пока они не выполняются одновременно (параллельно), они не влияют друг на друга.
Следовательно, использование сценария оболочки для последовательного выполнения A и B позволяет B работать какесли A никогда не использовал какую-либо память, значит, - это обходной путь - очень уродливый.
Поскольку вы можете запускать A и B поочередно, вам следует исправить A, чтобы он очистилсяза собой и освобождает любую память.Установка всех ссылок на любой объект, который не нужен после выполнения A для nil
, позволит сборщику мусора Ruby освободить всю использованную память.
Наилучшим подходом будет пройти через скрипт Ruby и установитьобъект ссылается на nil
, как только вы закончите с этим объектом, а не сделаете это в конце.Впоследствии вы можете обнаружить, что ваш скрипт значительно уменьшил использование памяти.
Хранение ссылок на ненужные объекты - это одна из форм утечки памяти, которая может привести к тому, что программа использует чрезмерное количество памяти.Списки и деревья, которые растут бесконечно, из-за того, что объекты добавляются, но никогда не удаляются, являются очень распространенной причиной этого.Это также может значительно снизить производительность кода, так как синтаксический анализ деревьев и - особенно - списков происходит медленнее по мере их увеличения.
Хороший мысленный тест: «Нужно ли моему алгоритму столько памяти на бумаге?»