2015-11-02 86 views
1

我已经写了一个递归函数来获取julia中较大数组中的对象。出现下列错误:StackOverflowError与元组

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有多大,我怎样才能避免stackoverflow?有另一种方法来保存我的价值观吗?

+0

IMO,使用机器RAM作为大数据阵列的库存,可能会导致你对不同种类的内存相关的问题,所以最好将它们存储在文件中,朱莉娅提供了不同的方式处理数据文件的工作:HTTPS:/ /github.com/svaksha/Julia.jl/blob/master/Database.md,但我对你的数据类型的建议是将它们存储在一个**内存映射**数组中,内存映射是一个茱莉亚内置工具,可帮助您处理大量数据,http://docs.julialang.org/en/release-0.4/stdlib/io-network/#memory-mapped-io –

+0

@LuWi道歉。我其实并没有打扰到这个链接,所以我不知道这导致了一个SO问题。我会删除我之前的评论。 – Jubobs

回答

3

,因为它的评论,我认为更好的方法存在与大数据阵列的工作,而这个答案主要是属于你的问题的这部分:

有另一种方式来保存我的价值观?

我已经准备了一个测试,以显示如何与大数据阵列打交道时,下列功能使用mmap是有帮助的都做同样的事情:他们创造的3 * 10E6 float64,然后填充它,计算sum矢量和打印结果,在第一个(mmaptest()),存储器映射结构已被用于存储Vector{Float64}而第二个(ramtest())做机压头的工作:

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使得代码更慢,同时需要更少的存储器。

我希望它可以帮助你,问候。

+0

尊敬的Reza Afzalan,非常感谢您的回答。这是非常有用的,我会用它在朱莉亚进一步编程!我已经重写我的代码来解决问题的根源,整个算法在工作示例中运行得更好。如果你想看看新的问题:http://stackoverflow.com/questions/33660916/vcat-stackoverflowerror-in-julia。非常感谢,关心clax – clax