52111


以下のコードでメモリーエラーになってしまい、メモリーを開放したいのですが、やり方が全くわからないのですが、、

[Julia Execution get out of memory
error](https://discourse.julialang.org/t/julia-execution-get-out-of-memory-
error/5238/2)

などを参考に探してはいます。  
以下のコードのstage8でエラーがでてしまいます

[code]

    stage1 = [1 1 1 1;1 0 0 1;1 0 0 1; 1 1 1 1]
    #stage2 one_side=9
    empty2 = zeros(Int8,4,4)
    line2_1= hcat(stage1,stage1,stage1,stage1)
    line2_2= hcat(stage1,empty2,empty2,stage1)
    stage2 = vcat(line2_1,line2_2,line2_2,line2_1)#16
    #stage3
    empty3 = zeros(Int8,16,16)
    line3_1= hcat(stage2,stage2,stage2,stage2)
    line3_2= hcat(stage2,empty3,empty3,stage2)
    stage3 = vcat(line3_1,line3_2,line3_2,line3_1)#64
    #stage4
    empty4 = zeros(Int8,64,64)
    line4_1= hcat(stage3,stage3,stage3,stage3)
    line4_2= hcat(stage3,empty4,empty4,stage3)
    stage4 = vcat(line4_1,line4_2,line4_2,line4_1)#256
    #stage5
    empty5 = zeros(Int8,256,256)
    line5_1= hcat(stage4,stage4,stage4,stage4)
    line5_2= hcat(stage4,empty5,empty5,stage4)
    stage5 = vcat(line5_1,line5_2,line5_2,line5_1)#1024
    #stage6
    empty6 = zeros(Int8,1024,1024)
    line6_1= hcat(stage5,stage5,stage5,stage5)
    line6_2= hcat(stage5,empty6,empty6,stage5)
    stage6 = vcat(line6_1,line6_2,line6_2,line6_1)#4096
    #stage7
    empty7 = zeros(Int8,4096,4096)
    line7_1= hcat(stage6,stage6,stage6,stage6)
    line7_2= hcat(stage6,empty7,empty7,stage6)
    stage7 = vcat(line7_1,line7_2,line7_2,line7_1)
    ###
    empty8 = zeros(Int8,16384,16384)
    line8_1= hcat(stage7,stage7,stage7,stage7)
    line8_2= hcat(stage7,empty8,empty8,stage7)
    stage8 = vcat(line8_1,line8_2,line8_2,line8_1)
    ############
    stage = copy(stage8)
    
[/code]

結果

[code]

    OutOfMemoryError()
    
    Stacktrace:
     [1] Type at .\boot.jl:396 [inlined]
     [2] Type at .\boot.jl:404 [inlined]
     [3] similar at .\array.jl:332 [inlined]
     [4] similar at .\abstractarray.jl:575 [inlined]
     [5] _typed_hcat(::Type{Int64}, ::NTuple{4,Array{Int64,2}}) at .\abstractarray.jl:1254
     [6] typed_hcat(::Type{Int64}, ::Array{Int64,2}, ::Array{Int64,2}, ::Array{Int64,2}, ::Vararg{Array{Int64,2},N} where N) at .\abstractarray.jl:1235
     [7] hcat(::Array{Int64,2}, ::Array{Int64,2}, ::Array{Int64,2}, ::Vararg{Array{Int64,2},N} where N) at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.0\SparseArrays\src\sparsevector.jl:1066
     [8] top-level scope at In[9]:35
    
[/code]

使っているパソコンは

[code]

    Windows64
    容量は8GB
    CORE i5
    
[/code]

です。  
メモリー開放についてご教授いただければ幸いです。。。


CC BY-SA 4.0
2019-01-19T05:34:26.013
52106
2019-01-19T06:49:30.187
2019-01-19T05:36:14.683
3060
29111
question
julia
Julia memory error()　の対処方法

[code]

    empty2 = zeros(Int8,4,4)
    
[/code]

としているので、`Int8`を要素に持つarrayを作ろうとしていると仮定して説明します。

一番最初で

[code]

    stage1 = [1 1 1 1;1 0 0 1;1 0 0 1; 1 1 1 1]
    
[/code]

としていますが、64bit
OSですので、`stage1`は`Int64`のarrayになっています。このため`hcat`や`vcat`で`Int8`のデータは`Int64`に変換されてしまいます。`stage8`の要素の数は65536*65536=4Gで、`Int64`は8バイトなので、`stage8`のサイズは32Gバイトになります。`stage8`単独でもメモリ不足のエラーになりそうです。

`stage1`を作るときに

[code]

    stage1 = Array{Int8,2}([1 1 1 1;1 0 0 1;1 0 0 1; 1 1 1 1])
    
[/code]

とすれば、以降`Int8`型でデータを作成するので、ぎりぎりメモリ不足にはならないと思います。

* * *

メモリの解放は、使わなくなった変数に、何か小さなサイズの値を代入すれば(例えば`stage7=0`)、そのうちGCで解放されると思います。ただし、このデータの作り方だと、`line8_1`、`line8_2`、`stage8`の三つの変数のサイズだけで、`stage7`まで変数の合計と同じくらいになっているはずなので、`stage7`までの値を解放しても焼け石に水かもしれません。


CC BY-SA 4.0
2019-01-19T06:49:30.187
52111
2019-01-19T06:49:30.187
3605
52106
answer