6

Numpy 配列のメモリ管理について質問があります。次を使用してバッファから numpy 配列を作成するとします。

>>> s = "abcd"
>>> arr = numpy.frombuffer(buffer(s), dtype = numpy.uint8)
>>> arr.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : False
  WRITEABLE : False
  ALIGNED : True
  UPDATEIFCOPY : False
>>> del s # What happens to arr?

上記の状況で、「arr」は「s」への参照を保持していますか? 「s」を削除すると、「s」に割り当てられたメモリが解放され、「arr」が未割り当てメモリを参照する可能性がありますか?

私が持っている他のいくつかの質問:

  • これが有効な場合、Python は「s」によって割り当てられたメモリを解放するタイミングをどのように知るのでしょうか? gc.get_referrents(arr) 関数は、「arr」が「s」への参照を保持していることを示していないようです。
  • これが無効な場合、「s」への参照を「arr」に登録して、Python GC が「s」へのすべての参照がなくなったときに自動的に「s」を取得できるようにするにはどうすればよいですか?
4

2 に答える 2

6

以下は、物事を少し明確にする必要があります。

>>> s = 'abcd'
>>> arr = np.frombuffer(buffer(s), dtype='uint8')
>>> arr.base
<read-only buffer for 0x03D1BA60, size -1, offset 0 at 0x03D1BA00>
>>> del s
>>> arr.base
<read-only buffer for 0x03D1BA60, size -1, offset 0 at 0x03D1BA00>

最初のケースdel sでは、配列が指しているものはbufferそれから作成されたものであり、他のどこにも参照されていないため、効果はありません。

>>> t = buffer('abcd')
>>> arr = np.frombuffer(t, dtype='uint8')
>>> arr.base
<read-only buffer for 0x03D1BA60, size -1, offset 0 at 0x03C8D920>
>>> arr.base is t
True
>>> del t
>>> arr.base
<read-only buffer for 0x03D1BA60, size -1, offset 0 at 0x03C8D920>

2 番目のケースでは、オブジェクトを指すdel t変数を削除しますが、配列には同じ への参照が残っているため、削除されません。チェック方法はわかりませんが、今なら、オブジェクトは最後の参照を失い、自動的にガベージ コレクションされるはずです。tbufferbufferdel arrbuffer

于 2013-02-14T01:02:31.743 に答える