17

SOユーザーが以前にこの質問をしたことがありますが、2009年に質問されたので、HDF5に関する知識が増えるか、新しいバージョンでこの特定の問題が修正されることを期待していました。私自身の問題に関するここでの質問を言い換えます。

大きなジオメトリからのノードと要素の巨大なファイルがあり、そこから必要なすべての有用な情報をすでに取得しています。したがって、Pythonでは、元のファイルを保持しようとしていますが、不要な情報を削除し、他のソースの詳細情報を入力します。たとえば、必要のないノードのデータセットがあります。ただし、隣接するデータセットを保持し、外部ファイルからのインデックスに関する情報を含める必要があります。これらの特定のデータセットを削除する方法はありますか?

または、HDF5ファイルに「プレースキーパー」を含めるという古い考えは依然として当てはまり、情報を削除する方法や他の人を誰も知らないのでしょうか。情報を削除して追加するだけで、まったく新しいファイルを作成する方が速い限り、空きスペースについてはあまり心配していません。

注:私はH5pyの「r+」を使用して読み取りと書き込みを行っています。

4

3 に答える 3

15

hdf5ファイルからノード全体(グループまたはデータセット)を削除しても問題はありません。
ただし、スペースを再利用する場合は、h5repackツールを実行する必要があります。

hdf5ドキュメントから:

5.5.2。ファイルからのデータセットの削除とスペースの再利用

現時点では、HDF5は、ファイルからデータセットを削除したり、削除されたオブジェクトが占有していたストレージスペースを再利用したりするための簡単なメカニズムを提供していません。

データセットの削除と使用したスペースの再利用は、H5Ldelete関数とh5repackユーティリティプログラムを使用して実行できます。H5Ldelete関数を使用すると、データセットへのリンクをファイル構造から削除できます。すべてのリンクが削除されると、データセットはどのアプリケーションからもアクセスできなくなり、ファイルから効果的に削除されます。リンクされていないデータセットが占めるスペースを回復する方法は、ファイルのすべてのオブジェクトを新しいファイルに書き込むことです。リンクされていないオブジェクトはアプリケーションにアクセスできず、新しいファイルに含まれません。新しいファイルへのオブジェクトの書き込みは、カスタムプログラムまたはh5repackユーティリティプログラムを使用して実行できます。

または、PyTablesのptrepackツールを調べることもできます。PyTablesはh5pyhdf5ファイルを読み取ることができるはずであり、ptrepackツールはに似ていh5repackます。

データセットからレコードを削除する場合は、保持するレコードを取得して新しいデータセットを作成し、古いデータセットを削除する必要があります。
PyTablesは行の削除をサポートしていますが、お勧めしません。

于 2012-06-26T19:41:59.923 に答える
1

分析プロセスの最後に特定のデータセットが削除されることがわかっている場合、それをマスターファイルに保持するのはなぜですか?一時データを別のHDF5ファイルに保存します。このファイルは、分析の完了後に破棄できます。マスターファイル内の一時データセットをリンクすることが重要な場合は、H5Lcreate_external()を使用してマスターと一時データセットの間に外部リンクを作成するだけです。外部リンクはごくわずかなスペースを消費します。

于 2017-09-27T11:54:04.960 に答える
0

HDF5 1.10以降には、ファイルスペース管理のメカニズムがあります。H5F.createでfcpl(ファイル作成プロパティ一覧)を指定することで実装できます。

気付く重要な変更の1つは、最初のインポート後のファイルが最初のインポートで少し大きくなることです(Kb単位)。ただし、その後、ファイルサイズは最終的に小さくなります(再利用プロセス後)。

h5statツールを使用して、HDF5ファイルの空き領域を監視できます

h5stat -S filename
于 2018-08-28T05:29:19.630 に答える