2016-03-30 18 views
0

私は以下のプログラムを実行するとメモリが非常に高速に増加するので、 "secundary_function"という名前の関数で使われているメモリは解放されていないと思います。要素をコピーしてリストに追加すると、問題が発生したり、使用しなかったりすると、secundary_functionの問題は解消されます。私はコピーはここでは必要である理由を理解したいのですが、なぜsecundary_functionが使用するメモリに影響を与える。..機能が終了してもメモリが解放されないのはなぜですか?

import numpy as np 
import time 

def main_function(N): 
    liste_images = [] 

    for i in range(N) : 
     images = np.zeros((3000,25,25)) 
     time.sleep(0.05) 
     secundary_function(images) 
     liste_images.append(images[0]) 

def secundary_function(images): 
    conservee = np.arange(len(images)) 
    images[conservee] 

main_function(6000) 

は、あなたの答えと私の英語のため申し訳ありませんありがとうございます!この行に

+0

3000x25x25の3Dアレイを6000回生成しているようです。それはあなたの意図ですか? – roadrunner66

+0

メモリを解放するためのこのリンクも参照してください:http://stackoverflow.com/questions/18310668/is-freeing-handled-differently-for-small-large-numpy-arrays – roadrunner66

+0

元のプログラムイメージでは、別の3D配列とliste_imagesリストに保持したい25x25 2D配列のいくつかを選択するテストがあります。しかし、私の考えでは、新しい3D配列の「イメージ」を作成するたびに、メモリを解放する必要があります。 –

答えて

2

liste_images.append(images[0]) 

images[0]は3000x25x25 imagesアレイのビューを作成します。つまり、liste_imagesに追加するimages[0]の結果には、3000x25x25アレイ全体への参照が含まれています。この大きな配列はガベージコレクションされません。コピーを実行すると、新しい25x25配列を作成し、forループの次の繰り返しで大型配列を解放することができます。

+0

しかし、なぜ私が関数 'secundary_function'を使わないと、問題が消えてしまうのか分かりません... –

+0

@YohanP。 - この質問を参照してください:http://stackoverflow.com/q/35382596/ –

+0

@morningsunありがとうございます。私は理解していると思います。私が 'images [conservee]'という行を 'images * 2 'に置き換えると、問題は同じです。私はそれがRAMにない場合、私はそれを使用しないときに配列が在庫されている場所を理解していないだけです。ハードディスクに?非常に遅いでしょうか? –

関連する問題