带有元组的StackOverflowError

时间:2015-11-02 22:02:53

标签: julia

我编写了一个递归函数,用于在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有多大,我怎样才能避免堆栈溢出?还有另一种方法来保存我的价值观吗?

1 个答案:

答案 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会使代码变慢,同时需要更少的内存。

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