Julia 1.1 with JLD HDF5 package and memory release in Windows
Julia 1.1 with JLD HDF5 package and memory release in Windows
我正在使用带有 JLD 和 HDF5 的 Julia 1.1 将文件保存到磁盘上,我遇到了几个关于内存使用的问题。
问题 1:
首先,我定义了一个4GB的矩阵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));
任务管理器会告诉我缓存的内存已释放,总内存使用量再次只有 4GB。
问题 1:
Julia 中的内存管理是怎么回事?这只是 Windows 的一个错误,还是 Julia 中的某个命令?如何即时查看 Julia 内存使用情况?
问题 2:
如何让Julia立即释放内存占用?
问题 3:
有没有办法告诉 JLD 包不要使用那些额外的 4GB 内存?
(更好,有人能告诉我如何直接在磁盘上创建 A 而无需在内存中创建它吗?我知道 JLD 包中有内存映射 I/O。我试过了,但似乎要求我在内存中创建矩阵A,然后先将A保存到磁盘上,然后我才能再次调用内存映射A。)
这个问题很长,谢谢!
Julia 使用垃圾收集器释放内存。通常,垃圾收集器不会 运行 在每行代码之后,而是仅在需要时才这样做。
尝试通过 运行ning 命令强制垃圾回收:
GC.gc()
这会为未引用的 Julia 对象释放内存 space。通过这种方式你可以检查内存是否真的已经被释放了。
旁注:JLD 曾经有点不总是工作(我不知道当前状态)。因此,您首先考虑的非跨平台对象持久性始终应该是内置 Serialization
包中的 serialize
函数——查看 https://docs.julialang.org/en/v1/stdlib/Serialization/index.html# 上的文档Serialization.serialize
我正在使用带有 JLD 和 HDF5 的 Julia 1.1 将文件保存到磁盘上,我遇到了几个关于内存使用的问题。
问题 1:
首先,我定义了一个4GB的矩阵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));
任务管理器会告诉我缓存的内存已释放,总内存使用量再次只有 4GB。
问题 1:
Julia 中的内存管理是怎么回事?这只是 Windows 的一个错误,还是 Julia 中的某个命令?如何即时查看 Julia 内存使用情况?
问题 2:
如何让Julia立即释放内存占用?
问题 3:
有没有办法告诉 JLD 包不要使用那些额外的 4GB 内存?
(更好,有人能告诉我如何直接在磁盘上创建 A 而无需在内存中创建它吗?我知道 JLD 包中有内存映射 I/O。我试过了,但似乎要求我在内存中创建矩阵A,然后先将A保存到磁盘上,然后我才能再次调用内存映射A。)
这个问题很长,谢谢!
Julia 使用垃圾收集器释放内存。通常,垃圾收集器不会 运行 在每行代码之后,而是仅在需要时才这样做。
尝试通过 运行ning 命令强制垃圾回收:
GC.gc()
这会为未引用的 Julia 对象释放内存 space。通过这种方式你可以检查内存是否真的已经被释放了。
旁注:JLD 曾经有点不总是工作(我不知道当前状态)。因此,您首先考虑的非跨平台对象持久性始终应该是内置 Serialization
包中的 serialize
函数——查看 https://docs.julialang.org/en/v1/stdlib/Serialization/index.html# 上的文档Serialization.serialize