带有JLD HDF5封装的Julia 1.1和Windows中的内存版本

时间:2019-03-23 02:26:57

标签: memory-management julia memory-mapped-files

我正在使用带有JLD和HDF5的Julia 1.1将文件保存到磁盘上,在那里我遇到了一些有关内存使用的问题。

问题1:

首先,我定义了一个4 GB的矩阵A。

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

当我键入命令并查看Windows任务管理器时:

A=nothing

朱莉娅花了几分钟的时间才将这些记忆释放给我。在大多数情况下,(在任务管理器中)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:

如何告诉茱莉亚立即释放内存使用情况?

问题3:

有没有办法告诉JLD软件包不使用那些额外的4GB内存?

(更好的是,有人可以告诉我如何在磁盘上直接创建A甚至不在内存中创建它吗?我知道JLD包中有内存映射的I / O。我已经尝试过,但是似乎需要我这样做在内存中创建矩阵A并先将A保存到磁盘上,然后才能再次调用映射的内存A。)

这是一个很长的问题,所以谢谢您!

1 个答案:

答案 0 :(得分:2)

Julia使用垃圾收集器取消分配内存。通常,垃圾回收器不会在每一行代码之后运行,而只会在需要时运行。

尝试通过运行以下命令来强制垃圾回收:

GC.gc()

这将释放未引用的Julia对象的存储空间。这样,您可以检查内存是否实际已释放。

侧面说明:JLD过去一直无法正常工作(我不知道当前状态)。因此,您首先要考虑的非跨平台对象持久性始终应该是内置serialize包中的Serialization函数-请查看https://docs.julialang.org/en/v1/stdlib/Serialization / index.html#Serialization中的文档。序列化