Julia 1.1在Windows中使用JLD HDF5软件包和内存版本

问题描述 投票:0回答:1

我正在使用带有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内存使用情况?

问题2:

如何告诉Julia立即释放内存使用情况?

问题3:

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

(更好的是,有人可以告诉我如何直接在磁盘上创建A而不在内存中创建它吗?我知道JLD包中有内存映射I / O.我已经尝试过了,但它似乎要求我创建矩阵A在内存中首先将A保存到磁盘上,之后我再次回想起映射到A的内存。)

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

memory-management julia memory-mapped-files
1个回答
2
投票

Julia使用垃圾收集器来释放内存。通常,垃圾收集器不会在每行代码之后运行,而是仅在需要时运行。

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

GC.gc()

这会释放未引用的Julia对象的内存空间。通过这种方式,您可以检查内存是否实际已释放。

旁注:JLD曾经有点不总是在工作(我不知道当前的状态)。因此,您首先考虑非跨平台对象持久性始终应该是来自内置serialize包的Serialization函数 - 请查看https://docs.julialang.org/en/v1/stdlib/Serialization / index.html上的文档#Serialization.serialize

© www.soinside.com 2019 - 2024. All rights reserved.