web-dev-qa-db-ja.com

h5pyを使用して、すでに開いているhdf5ファイルを書き込みモードで開く

同じPythonプログラムを異なるプロセスとして同時に実行していますが、これらはすべて、_hdf5_ Pythonパッケージを使用して、同じ_h5py_ファイルに書き込みたいと考えています。ただし、特定の_hdf5_ファイルを書き込みモードで開くことができるプロセスは1つだけです。そうしないと、エラーが発生します。

OSError:ファイルを開くことができません(ファイルをロックできません、errno = 11、エラーメッセージ= 'リソースが一時的に利用できません')

上記の例外の処理中に、別の例外が発生しました。

OSError:ファイルを作成できません(ファイルを開くことができません:name = 'test.hdf5'、errno = 17、エラーメッセージ= 'ファイルが存在します'、flags = 15、o_flags = c2)

ファイルがすでに書き込みモードで開かれているかどうかを確認することでこれを解決したいと思います。開いている場合は、少し待ってから、書き込みモードで開かれなくなるまでもう一度確認します。 _h5py_または_hdf5_のそのようなチェック機能は見つかりませんでした。今のところ、私の解決策はこれに基づいています:

_from time import sleep
import h5py

# Function handling the intelligent hdf5 file opening
def open_hdf5(filename, *args, **kwargs):
    while True:
        try:
            hdf5_file = h5py.File(filename, *args, **kwargs)
            break  # Success!
        except OSError:
            sleep(5)  # Wait a bit
    return hdf5_file

# How to use the function
with open_hdf5(filename, mode='a') as hdf5_file:
    # Do stuff
    ...
_

あまり優しくないので、好きかどうかわかりません。これを行うためのより良い方法はありますか? try内のファイルを誤って開こうとすると、他のプロセスで実行されている書き込みプロセスが何らかの形で破損する可能性があるという変更はありますか?

6
jmd_dk

簡単な調査から判断すると、ファイルがすでにオープン書き込みモードであるかどうかを確認するプラットフォームに依存しない方法はありません。 Pythonでファイルがis_openでopen_statusかどうかを確認する方法https://bytes.com/topic/python/answers/612924-how-check-whether-file-open-not

ただし、hdf5ファイルの読み取り/書き込み用のラッパーオープン読み取り/書き込みメソッドを定義しているため、hdf5ファイルを開くことに成功したプロセスが1つある場合は、いつでも「file_name」.lockファイルを作成できます。

次に、os.path.exists( '"file_name" .lock')を使用して、ファイルを書き込みで開くことができるかどうかを確認するだけです。モード。

本質的に、それはあなたが何をするかについてそれほど違いはありません。ただし、最初にファイルシステムを調べて、プロセスの1つが書き込みモードでファイルにアクセスするかどうかを確認できます。次に、os.path.existsがブール値を返すため、テストは例外の結果ではありません。

多くのアプリケーションはこの種のトリックを使用します。 CVSリポジトリをローミングすると、.lockファイルが周りにあるのをよく目にします...

2
PilouPili