从Julia中的jld文件中有选择地加载元素

时间:2019-02-19 02:25:37

标签: tuples julia loading

我用results程序包编写的方式在Julia中保存了一个名为JLD的对象

@save "res.jld" results

对象results是一个

81-element Array{Tuple{Int64,Float64,Array{Array{Array{Int64,1},1},1},Array{Array{Array{Int64,1},1},1},Array{Int64,1}},1}

其中每个元素都有5个元素:Int64Float64Array{Array{Array{Int64,1},1},1}Array{Array{Array{Int64,1},1},1}Array{Int64,1}

如何在不加载整个文件的情况下访问每个元素的前两个元素(Int64Float64),因为它需要大量的内存。我想避免使用@load "res.jld",因为它太重了。

1 个答案:

答案 0 :(得分:3)

恐怕您要找的东西不太可能。有hyperslabbing,JLD也有partially supported(简单示例here)。它将允许您逐一阅读每个元素。但是,它不能使您仅加载每个元素的前两个组件。

尽管如此,逐个迭代每个元素可能仍然有用,因为可以避免将整个数据集加载到内存中(因此,您可以处理太大而无法保存在内存中的数据集)。不过,它可能不比加载完整的数据集要快(如果可以)。

创建一些(简化的)伪造数据并将其保存到磁盘

using JLD
results = [(i, Float64(i), rand(3)) for i in 1:1000];
@save "res.jld" results

基本上,我上面所描述的看起来像这样

jldopen("res.jld") do f
    for k in 1:length(f["results"])
        f["results"][k][1][1:2] # read k-th element and extract first two components.
    end
end