web-dev-qa-db-ja.com

開いているh5pyデータファイルを閉じる

ラボでは、データをhdf5ファイルにpythonパッケージh5py]を介して保存します。

実験の最初に、hdf5ファイルを作成し、(特に)ファイル内のデータの配列の配列の後に配列を格納します。実験が失敗または中断した場合、ファイルは正しく閉じられません。実験はiPythonから実行されるため、データオブジェクトへの参照はメモリ内に(どこかに)残ります。

開いているすべてのh5pyデータオブジェクトをスキャンして閉じる方法はありますか?

15
Adriaan Rol

これはそれを行う方法です(例外なくファイルのクローズ状態を確認する方法を理解できませんでした、おそらくあなたは見つけるでしょう):

import gc
for obj in gc.get_objects():   # Browse through ALL objects
    if isinstance(obj, h5py.File):   # Just HDF5 files
        try:
            obj.close()
        except:
            pass # Was already closed

別のアイデア:

依存howファイルの使用方法、コンテキストマネージャとwithキーワードの使用についてはどうですか?

with h5py.File("some_path.h5") as f:
   f["data1"] = some_data

プログラムフローがwithブロックを終了すると、例外など、何が発生してもファイルは閉じられます。

18
honza_p

pytablesh5pyが使用)は、開いているすべてのファイルを追跡し、開いているすべてのhdf5ファイルを強制的に閉じる簡単な方法を提供します。

import tables
tables.file._open_files.close_all()

その属性_open_filesには、開いているファイルの情報とハンドラーを提供するための便利なメソッドもあります。

2
OrangeSherbet

HFile .bool()が開いている場合はTrueを返し、そうでない場合はFalseを返すことがわかりました。これは、確認する最も簡単な方法かもしれません。つまり、次のようにします。

hFile = h5py.File(path_to_file)
if hFile.__bool__():
       hFile.close()
0
Avinash Pujala