2012-06-18 8 views
6

私は単純なJenaデータセットで作業しています。これには、〜30 MBのRDFファイルが1つしかインポートされていません。アプリケーションの一部として、私はユーザーが既定のグラフ(または名前付きグラフ)を照会し、結果のトリプルをクエリから新しい名前付きグラフに挿入しようとしています。このため、私はCONSTRUCT文を使用してRDFフォームでトリプルの結果セットを作成し、これらのトリプルを新しいモデルに入れて(QueryExecution.execConstruct()を使用)、このモデルをデータセットに追加しています。これは、データセットが新しいグラフノードを取得し、TDBデータベースフォルダのディスクサイズが大きくなるため、再び機能するように見えます。TDBバックアップのJena Datasetのサイズを縮小するにはどうすればよいですか?

この問題は、データセットから名前付きグラフを削除しようとすると発生します。データセットのremoveNamedName( "graphName")メソッドを使用して、データセットからモデルを削除します。そのモデル名に対する将来の照会は、正常に削除されたことを示します。ただし、TDBデータベースフォルダのディスクサイズは、同期および終了後も同じサイズのままです。

最初は、削除されたファイルのスペースを空きとしてマークして、新しいデータが入ったときに上書きされる可能性があると思っていましたが、そうは思われません。名前付きグラフを削除して直ちに同じプログラムを実行するとそのフォルダが大きくならないようですが、新しい名前付きグラフを追加して同じ実行で削除すると、フォルダサイズが大きくなり、モデルが大きくなります削除によってメモリが解放されることはありません。つまり、データベースフォルダを数回実行すると、それ以上のデータを保持せずに元のサイズの5〜10倍になります。

洞察や助けがあれば嬉しいです。ありがとうございました。

答えて

6

あなたはJenaメーリングリスト(users @ jena.apache.org)に質問してより多くの洞察を得ることができますが、私は答えようとします。また、ウェブサイトのTDB Architectureページをご覧ください。

TDBは、RDFノードを64ビット整数IDにマッピングするノードテーブルと呼ばれるものを構築することによってデータを格納します。次に、これらの整数IDを使用して別々の索引を作成し、SPARQL照会に応答するために必要なさまざまなデータベース・スキャンを実行できるようにします。

データを追加すると、これらの構造(ノードテーブルとインデックス)の両方にエントリが追加される可能性がありますが、データを削除するとインデックスからデータが削除されるだけです。したがって、ノードテーブルから削除されないため古いデータを削除しても、ノードテーブルは時間の経過と共に増加し続けます。

この背後にある実際的な理由は2つあります:ノードの検索にIDが高速ファイル検索であるので

  1. 整数IDは、一部のデータが削除されたとして、あなたがノードの部分を削除することはできませんので、ファイルオフセットをエンコードすべてのノードIDを書き換えることなく、つまりID - >ノード方向のノードテーブルはシーケンシャルファイルです(挿入の高速化に役立ちます)
  2. ノードが複数回使用されているかどうかはわかりません完全なデータベーススキャンを実行する必要はありません。したがって、最初にノードテーブルエントリを削除する必要があるかどうかを判断することはできません。これを実行する実行可能な唯一の方法は、それ自体がシステムに複雑さを加え、追加と削除を遅らせる完全な参照カウント方式を実装することです。

免責事項 - 私はイエナプロジェクトのコミッターだが、これは私の最高の理解を反映しており、完全に正確ではないかもしれないので、がTDBコンポーネント上で個人的にどんな仕事をしたことがありません。

+0

ありがとうございました!私は間違いなくメーリングリストをチェックしています。それは削除が必ずしもテーブルのサイズを縮小するとは限りませんが、それは理解できます。再度、感謝します。 – paul

関連する問題