Я немного смущен распределением памяти в Джулии. я узнать из часто задаваемых вопросов, что очистка памяти, используемой большой переменной, выполняется путем установки ее на что-то маленькое (например, 0), а затем выполняется gc()
.
Однако меня немного смущает следующее. Я создаю случайный массив Float32
:
@time A = rand(Float32, 10000, 10000);
time
указывает, что распределено ~ 400 МБ ОЗУ, а использование ОЗУ Джулии увеличивается на 400 МБ. Это имеет смысл.
Затем я применяю fft
, но не привязываю результат к любой переменной:
@time fft(A);
time
указывает, что распределено ~ 800 МБ ОЗУ, а использование ОЗУ Джулии увеличивается на 800 МБ.
Однако использование ОЗУ остается на 1,2 ГБ выше, чем в начале. И это меня смущает, потому что я не приравнивал любую переменную к fft(A)
, поэтому я ожидал бы, что выделенное 800 МБ будет немедленно освобождено после выполнения fft
.
Я попытался запустить gc
, думая, что Джулия поймет, что есть еще 800 МБ ОЗУ, которая использовалась для ничего:
gc();
Это ничего не делает. Использование ОЗУ остается на ~ 1,3 ГБ.
Однако следующие две строки,
A = 0;
gc();
освобождает все 1,2 ГБ, которые используются, несмотря на то, что sizeof(A)
составляет всего 400 МБ. Поэтому мой вопрос:
- Почему это выглядит так, как будто размер объекта размером 400 МБ (согласно
sizeof
) на самом деле имеет 1,2 ГБ, выделенный ему?