1

次のコード スニペット:

    HDFStore = pandas.io.pytables.HDFStore
    lock = threading.RLock()
    with lock:
        store = HDFStore('my_datafile.hdf','r')
        data_frame = store['my_series']
        store.close()
    return data_frame['my_column']

Web リクエストに応答して実行されるため、複数のスレッドで同時に実行される可能性があります。また、store.close が呼び出される前に実行が中断される可能性もあります。

再現できない問題 (HDFStore ライブラリの例外、または空のデータが返される) が発生しています。

このコードをスレッドセーフにし、例外が発生したときにファイルが正しく閉じられるようにする正しい方法は何ですか?

調査の結果、HDFStore には開いているファイルのキャッシュ メカニズムがあることがわかりました。これが問題なのでしょうか?

4

1 に答える 1

2

参考までに、パンダのドキュメントを参照してください

PyTables 3.1のリリースノートをリリースするだけです

これはPyTables 3.0.0 で動作するはずです。ファイルを他の場所に書き込んでいない限り(つまり、既に存在します)。

これも試すことができます:

with get_store('my_datafile.hdf',mode='r') as store:
    return store['my_series']

これは自動的に閉じます(これは言うまでもなくスレッドセーフだとは思いませんが、あなたの中に入れればwith lock:スレッドセーフになるでしょう。

読んでいるだけなら、スレッドセーフであることはまったく気にしません。複数のスレッド (またはプロセス) で書き込みを試みないでください。これにより、ファイルが爆発します。

PyTables 3.1 がリリースされたばかりで、少なくとも下位の HDF5 バージョンではファイル キャッシュ メカニズムが変更されています。バージョンを確認するには、次の手順を実行します。

import tables
tables.get_hdf_version()

これがスレッドの安全性に与える影響はわかりません。

于 2014-02-05T17:01:26.587 に答える