Julia 1.1 с пакетом JLD HDF5 и выпуском памяти в Windows - PullRequest
0 голосов
/ 23 марта 2019

Я использую Julia 1.1 с JLD и HDF5 для сохранения файла на диск, где я встретил пару вопросов об использовании памяти.

Выпуск 1:

Сначала я определил матрицу 4 ГБ A.

A = zeros(ComplexF64,(243,243,4000));

Когда я набираю команду и смотрю на диспетчер задач Windows:

A=nothing

Потребовалось несколько минут, чтобы Джулия вернула мне эти воспоминания. Большую часть времени (в диспетчере задач) Джулия просто не освобождает использование памяти вообще, хотя команда возвращала результаты, говоря, что A мгновенно занимает 0 байтов.

varinfo()

    name                    size summary
–––––––––––––––– ––––––––––– –––––––
A                    0 bytes Nothing
Base                         Module
Core                         Module
InteractiveUtils 162.930 KiB Module
Main                         Module
ans                  0 bytes Nothing

Выпуск 2:

Далее, когда я пытался использовать JLD и HDF5 для сохранения файла на диск. На этот раз диспетчер задач сказал мне, что при использовании команды save («test.jld», «A», A) использовалась дополнительная память объемом 4 ГБ.

using JLD,HDF5
A = zeros(ComplexF64,(243,243,4000));
save("test.jld", "A", A)

Далее, после того, как я набрал

A=nothing

Джулия не вернет мне 8 ГБ памяти.

Нахождение 3:

Интересная вещь, которую я обнаружил, заключалась в том, что, если я наберу команду еще раз

A = zeros(ComplexF64,(243,243,4000));

Диспетчер задач сказал бы мне, что наличная память была освобождена, и общее использование памяти снова составило всего 4 ГБ.

Вопрос 1:

Что происходит с управлением памятью в Юлии? Было ли это просто ошибкой Windows или какой-то командой в Юлии? Как проверить использование памяти Julia мгновенно?

Вопрос 2:

Как сказать Джулии, чтобы она немедленно высвободила использование памяти?

Вопрос 3:

Можно ли сказать, что пакет JLD не использует эти дополнительные 4 ГБ памяти?

(Лучше, кто-нибудь может сказать мне, как создать A непосредственно на диске, даже не создавая его в памяти? Я знал, что в пакете JLD есть отображение ввода-вывода с отображением в памяти. Я пробовал это, но, казалось, требовало от меня создайте матрицу A в памяти и сначала сохраните A на диск, прежде чем я смогу снова вызвать отображенную в памяти память A.)

Это длинный вопрос, поэтому спасибо, вперед!

1 Ответ

2 голосов
/ 24 марта 2019

Юлия использует сборщик мусора для удаления памяти.Обычно сборщик мусора запускается не после каждой строки кода, а только при необходимости.

Попробуйте запустить сборку мусора, выполнив команду:

GC.gc()

Это освобождает пространство памяти для объектов Julia, на которые нет ссылок.Таким образом, вы можете проверить, действительно ли память была освобождена.

Примечание: раньше JLD работал не всегда (я не знаю текущий статус).Следовательно, первое, что нужно учитывать при сохранении непросплатформенного объекта, всегда должна быть функция serialize из встроенного пакета Serialization - проверьте документацию по https://docs.julialang.org/en/v1/stdlib/Serialization/index.html#Serialization.serialize

...