Подтвердить что ты не робот

Смущает выделение памяти и сбор мусора в Джулии

Я немного смущен распределением памяти в Джулии. я узнать из часто задаваемых вопросов, что очистка памяти, используемой большой переменной, выполняется путем установки ее на что-то маленькое (например, 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 ГБ, выделенный ему?
4b9b3361

Ответ 1

Каждая команда возвращает что-то, даже если это только nothing. ans присваивается каждому возвращенному объекту, даже если нет прямого назначения, и даже если команда заканчивается точкой с запятой.

Используйте whos() между командами для просмотра назначений и выделенного пространства.