Это приведет к утечкам памяти в Rails? - PullRequest
0 голосов
/ 12 октября 2018

Я застрял в этой проблеме надолго.

Я хочу создать вложенный хэш.Раньше я делал это:

a = {}

a[x_id] ||= {}
a[x_id][y_id] || = {}
a[x_id][y_id] = z_value

Затем я пришел в stackoverflow и обнаружил следующее:

a = Hash.new {|h,k| h[k] = Hash.new(&h.default_proc) } #highlighted line
a[x_id][y_id] = z_value

Теперь я не понял "выделенную строку".Но когда я это реализовал, это сработало.

Теперь вопрос в том, как, и что более важно, это приведет к утечкам памяти в будущем с большим количеством данных или с большим количеством вложений в этом отношении?

Спасибо.

1 Ответ

0 голосов
/ 12 октября 2018

Я думаю, что вы неправильно понимаете утечки памяти или, по крайней мере, как это относится к Ruby (или, точнее, как не применяется).

Rubyиспользует сборщик мусора, который обрабатывает освобождение памяти, когда объект выходит из области видимости (т. е. больше не существует существующей ссылки на него).Если вы не выделяете память самостоятельно, как то, что делаете в C, вам не нужно заботиться о ее освобождении.

В Ruby, если вы не используете C API, не используете Fiddle / FFI для вызова внешнего кода (в некоторых случаях) или, возможно, в некоторых других крайних случаях, вам не нужно беспокоиться об освобождении памяти.Простое высвобождение объекта из области видимости выполнит ту же задачу внутренне.

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

Если, возможно, вы имеете в виду, например ...

hash[x][y] = z

... и затем позже вы выполняете то же действие, задаваясь вопросом, накапливается ли старое значение z,тогда «нет», это не так (при условии, что x и y одинаковы).Как упомянуто выше, сохранение нового значения в том же месте приводит к тому, что старый объект, который был там, выходит из области видимости, и Ruby освобождает свою память внутренне, пока на него больше не ссылаются.

...