我编写了一个递归函数,用于在julia中获取更大数组中的对象。发生以下错误:
ERROR: LoadError: StackOverflowError:
in cat_t at abstractarray.jl:831
in recGetObjChar at /home/user/Desktop/program.jl:1046
in recGetObjChar at /home/user/Desktop/program.jl:1075 (repeats 9179 times)
in getImChars at /home/user/Desktop/program.jl:968
in main at /home/user/Desktop/program.jl:69
in include at ./boot.jl:261
in include_from_node1 at ./loading.jl:304
in process_options at ./client.jl:308
in _start at ./client.jl:411
while loading /home/user/Desktop/program.jl, in expression starting on line 78
如果您想查看代码,我已经打开了一个问题(Assertion failed, process aborted)。在为julia v 0.4调试我的代码之后,更明显的是,导致问题的原因。 tupel locObj比9000个条目大得多,因为一个对象可以是例如150 x 150大。 这将导致locObj的长度为22500。 tupels有多大,我怎样才能避免堆栈溢出?还有另一种方法来保存我的价值观吗?
答案 0 :(得分:3)
正如评论所述,我认为有更好的方法来处理大数据数据,这个答案主要属于你的问题的这一部分:
还有其他方法来保存我的价值观吗?
我准备了一个测试来展示在处理大量数据时如何使用mmap
是有用的,以下函数都做同样的事情:它们创建一个3 * 10E6 float64
的向量,然后填充它,计算sum
并打印结果,在第一个(mmaptest()
)中,内存映射结构用于存储Vector{Float64}
而第二个(ramtest()
)在机器ram上做的工作:
function mmaptest()
s = open("./tmp/mmap.bin","w+") # tmp folder must exists in pwd() path
A = Mmap.mmap(s, Vector{Float64}, 3_000_000)
for j=1:3_000_000
A[j]=j
end
println("sum = $(sum(A))")
close(s)
end
function ramtest()
A = Vector{Float64}(3_000_000)
for j=1:3_000_000
A[j]=j
end
println("sum = $(sum(A))")
end
然后调用了两个函数并计算了内存分配大小:
julia> gc(); # => remove old handles to closed stream
julia> @allocated mmaptest()
sum = 4.5000015e12
861684
julia> @allocated ramtest()
sum = 4.5000015e12
24072791
从这些测试中可以明显看出,对于内存映射对象,内存分配要小得多。
julia> gc()
julia> @time ramtest()
sum = 4.5000015e12
0.012584 seconds (29 allocations: 22.889 MB, 3.43% gc time)
julia> @time mmaptest()
sum = 4.5000015e12
0.019602 seconds (58 allocations: 2.277 KB)
从@time测试中可以清楚地看出,使用mmap
会使代码变慢,同时需要更少的内存。
我希望它可以帮到你,问候。