Когда я запускаю программу на ruby, я предполагаю, что переменные хранятся в оперативной памяти. За исключением случаев, когда нам приходится листать страницы из-за нехватки оперативной памяти, будут ли они когда-либо храниться на жестком диске? Я думаю, что стеки и кучи важны, и я не смог найти никакой точной информации о том, где ruby хранит переменные.
Сохраняет ли Ruby переменные на жестком диске?
Ответы (3)
Спецификация языка Ruby не предписывает и не запрещает какую-либо конкретную стратегию хранения. Любая реализация может хранить значения где угодно и как угодно. Спецификация говорит только о том, каким должен быть результат выполнения программы на Ruby, а не о том, как выполняется программа. (Как и любая другая спецификация языка.)
Например, в SmallRuby объекты могут при некоторых обстоятельствах храниться на диске. И вся цель MagLev состоит в том, чтобы иметь реализацию Ruby, которая может работать с кучами которые на несколько порядков больше, чем оперативная память, за счет их хранения в распределенном кластере на диске.
Короткий ответ: надеюсь, нет. Но длинный ответ: да, в какой-то момент, если машине не хватит памяти, переменные Ruby должны будут записаться на диск.
Однако, чтобы ответить на ваш точный вопрос: нет, сам Ruby никогда не помещает переменные на жесткий диск (насколько мне известно), но в какой-то момент операционная система освободит память Ruby и отправит ее на диск.
Что еще интереснее, вы можете хранить переменные ruby на диске в файлах YAML (еще один язык разметки), .yml
. Итак, если вы пытаетесь сохранить сложный объект в базе данных с помощью Ruby, вы можете использовать текстовый столбец, а затем синтезировать его для создания экземпляра в качестве нового объекта данного класса.
Этот ответ относится к стандартной реализации MRI/YARV Ruby.
Как и любой другой процесс, память работающей программы Ruby контролируется операционной системой. Если какой-то другой процесс требует больше памяти, ОС попытается ее найти. Если свободной ОЗУ нет, ОС может потребоваться временно сохранить или развернуть ОЗУ другого процесса, например вашей программы на Ruby, на жестком диске. Он будет восстановлен в оперативной памяти, когда ваша программа снова запустится.
Важно отметить, что это полностью контролируется ОС — Ruby никогда не узнает, была ли его память выгружена или нет.