【发布时间】:2019-03-24 05:32:15
【问题描述】:
我正在使用带有 JLD 和 HDF5 的 Julia 1.1 将文件保存到磁盘上,在那里我遇到了几个关于内存使用的问题。
问题 1:
首先,我定义了一个 4 GB 的矩阵 A。
A = zeros(ComplexF64,(243,243,4000));
当我输入命令并查看 Windows 任务管理器时:
A=nothing
Julia 花了几分钟时间才将这些记忆释放给我。大多数时候,(在任务管理器中)Julia 根本不会释放内存使用量,即使命令返回的结果表明 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) 命令时,额外使用了 4GB 内存。
using JLD,HDF5
A = zeros(ComplexF64,(243,243,4000));
save("test.jld", "A", A)
另外,在我输入之后
A=nothing
Julia 不会将 8 GB 内存还给我。
发现 3:
我发现一个有趣的事情是,如果我重新输入命令
A = zeros(ComplexF64,(243,243,4000));
任务管理器会告诉我,cashed 内存被释放了,总内存使用量再次只有 4GB。
问题一:
Julia 中的内存管理是怎么回事?这只是 Windows 的错误,还是 Julia 中的某个命令?如何立即检查 Julia 内存使用情况?
问题 2:
如何告诉 Julia 立即释放内存使用量?
问题 3:
有没有办法告诉 JLD 包不要使用那些额外的 4GB 内存?
(更好,有人能告诉我如何直接在磁盘上创建A而不在内存中创建它吗?我知道JLD包中有内存映射I/O。我试过了,但似乎需要我在内存中创建矩阵 A 并先将 A 保存到磁盘上,然后我才能再次调用内存映射的 A。)
这是一个很长的问题,所以提前谢谢!
【问题讨论】:
-
这与日期无关,所以我删除了你的最后一个标签。
-
有时垃圾收集器不需要立即运行。当您拨打
GC.gc()时会发生什么? -
@PrzemyslawSzufel 谢谢!在我调用 GC.gc() 之后,它似乎正在工作(内存立即减少)。你知道发生了什么事吗? GC.gc() 做了什么?
-
我添加了一个答案(评论区是很好解释的缩写)
标签: memory-management julia memory-mapped-files