我使用的是Julia1.1,谢天谢地,JDL和JDL2似乎都能正常工作。
我想创建一个3d矩阵来保存到一个文件中,该文件在$(x,y,z)$中进行索引,使用
using JLD
save("File_name","variable_name",variable)
假设我已经这样做了,即
using JLD
save("some_file","Matrix_t", M_T)
其中M_T是空白的3d零数组。
然后我想保存与$z$轴相关的连续数据帧(就像Matlab中的matfile函数),这样每次我都可以将一个2d数组保存到M_T文件"some_file“中的索引位置。
我读到过g_create "group“的用法。但是,他们使用带有分号的名称,我怀疑这是否是我想要的。
您能帮我将3d Matrix中的顺序数据主动保存到一个文件中吗?
发布于 2019-03-14 22:25:50
由于JLD.jl
支持内存映射数组,因此您可以通过Memory Mapped I/O实现您想要的结果。
下面的代码片段将创建Float64
类型的三维数组,并将其保存到JLD
文件中。
using JLD
A = zeros(100, 100, 100)
save("mmap.jld", "A", A)
现在,让我们在另一个Julia会话中打开该文件,并将A
读取为内存映射数组。请注意,内存映射I/O不会一次将所有数组加载到内存中,因此,即使文件中的数组非常大,您也希望不会耗尽内存。
using JLD
file = jldopen("mmap.jld", "r+", mmaparrays = true) # `r+` important if you want to modify the array
A = read(file, "A")
A
是一个内存映射数组。您可以像使用普通3D Array
一样使用它。对A
的修改将写入磁盘上的文件中。(虽然您可能希望在完成所有更改后使用using Mmap; Mmap.sync!(A)
,以确保更改真正写入磁盘,但我不确定这一点。)
现在,我们将更改内容
A[:,:,1] .= 100
# close the file
close(file)
您现在可以关闭此会话,然后尝试在另一个会话中打开该文件以查看效果。
请注意,如果您想要在同一会话中再次打开A
文件(即A = []; GC.gc()
),则需要进行jld垃圾回收。否则将保持文件锁定,因为A
是内存映射到文件中的。如果您已经关闭了会话,则不需要执行此操作。
https://stackoverflow.com/questions/55172147
复制