2017-03-17 5 views
0

私はHDF5ファイルから読み込んだ潜在的に非常に大きな凹凸配列を作成して格納する関数を含むクラスを持っています。 (私はクラスオブジェクトとして配列を格納するので、ファイルからさまざまなHDF5データセットを読み込むと、手動ループではなくリストの理解が可能になります)。私が望むのは、格納された配列を同時に返したり削除したりすることですreturn文の後にメモリを置く)。Python:return文の後に自動的にクラスオブジェクトを削除する

class MWE(object): 
     def __init__(self,*args): 
      pass 
      return 

     def example(self,**kwargs): 
      self.array = readLargeArrayFromHDF5File(...) 
      return self.array # And simultaneously clean up self.array? 

私は単に私のスクリプトの後半でdel MWE.arrayのようなものを使用してアレイを削除することができることを知っているが、自動的に私はこれを行うには覚えていなくても、クリーンアップする方法はありますか?

ありがとうございます!

+0

私はまだ学んでいますので、クラスオブジェクトが返されたときにどのように/どのようにクリーンアップされるかを明確にすることができます。 self.arrayは記憶からクリアされますか? (MWEクラスがまだ存在するので...)私はちょうど "array2 = MWE.example()"をやめ、そして2回のメモリを使うのを避けたいと思っています。 – aim

+0

なぜあなたは配列を返してすぐにそれを削除するのですか?同じオブジェクトが呼び出し元に渡され、呼び出し元には渡されないことがわかりますか?また、delはオブジェクトへの参照を削除しているので、実際のメモリは保存されません。 –

+0

@aimああ、ちょうどあなたのコメントを見ました。したがって、それらはコピーではなく参照です。 Pythonでオブジェクトをコピーするときは、通常、 'list_A_copy = list(list_A)'や 'dict_A_copy = {key:dict_A.items()のキーの値}'のような明示的な処理が必要です。 –

答えて

1

あなたはこの種のもののためにcontext managerを使用することにネーテッド! withコードブロックからオブジェクトが自動的にクリアされます。

from contextlib import contextmanager 


class MWE(object): 

    def __init__(self, *args): 
     pass 
     return 

    @contextmanager 
    def example(self, **kwargs): 
     array = readLargeArrayFromHDF5File(...) 
     try: 
      yield array 
     finally: 
      array = None 

    @contextmanager 
    def example_two(self, **kwargs): 
     array = readLargeArrayFromHDF5File(...) 
     try: 
      for item in array: 
       yield item 
     finally: 
      array = None 
# usage 
with mwe_obj.example_two(kwargs) as result: 
    for r in result: 
     # work with your result here 
     print (r) 

# when your code hits this block self.array would get set to None 
print ('cleared large array') 
関連する問題