2012-06-18 2 views
6

나는 단지 ~ 30 MB의 RDF 파일을 가져온 간단한 Jena 데이터 세트로 작업하고 있습니다. 응용 프로그램의 일부로 사용자가 기본 그래프 (또는 명명 된 그래프)를 쿼리하고 쿼리의 결과 트리플을 새 명명 된 그래프에 삽입 할 수있게하려고합니다. 이를 위해 CONSTRUCT 문을 사용하여 RDF 형식의 결과 집합을 만든 다음 QueryExecution.execConstruct()를 사용하여 이러한 모델을 새 모델에 추가하고이 모델을 데이터 집합에 추가합니다. 이것은 데이터 집합이 새로운 그래프 노드를 얻고 TDB 데이터베이스 폴더의 디스크 크기가 커지면 다시 작동합니다.TDB가 지원하는 Jena Dataset의 크기를 줄이는 방법은 무엇입니까?

데이터 집합에서 명명 된 그래프를 제거하려고하면 여기에 문제가 발생합니다. 데이터 집합의 removeNamedName ("graphName") 메서드를 사용하여 데이터 집합에서 모델을 제거합니다. 해당 모델 이름에 대한 향후 쿼리는 성공적으로 제거되었음을 나타냅니다. 그러나 TDB 데이터베이스 폴더의 디스크 크기는 동기화 및 종료 후에도 동일하게 유지됩니다.

처음에는 데이터베이스가 삭제 된 파일의 공간을 무료로 표시하여 새 데이터가 들어올 때 덮어 쓸 수 있다고 생각했지만 처음에는 그렇지 않습니다. 명명 된 그래프를 삭제하고 같은 프로그램을 실행 한 직후에 대체하면 해당 폴더가 커지지 않는 것처럼 보입니다. 그러나 새 명명 된 그래프를 추가하고 동일한 그래프에서 삭제하면 폴더 크기가 커지고 모델이 커집니다 제거로 인해 메모리가 확보되지 않습니다. 즉, 몇 번 실행하면 데이터베이스 폴더가 더 이상 데이터를 보유하지 않고 원래 크기의 5 배 또는 10 배가됩니다.

어떤 통찰력이나 도움도 좋을 것입니다. 다시 감사드립니다.

답변

6

Jena 메일 링리스트 ([email protected])에 질문하면 더 많은 통찰력을 얻을 수 있지만 답변을 시도 할 것입니다. 웹 사이트의 TDB Architecture 페이지를 살펴볼 수도 있습니다.

TDB는 RDF 노드를 64 비트 정수 ID로 또는 그 반대로 매핑하는 노드 테이블을 작성하여 데이터를 저장합니다. 그런 다음 SPARQL 쿼리에 응답하는 데 필요한 다양한 데이터베이스 검색을 수행 할 수 있도록 이러한 정수 ID를 사용하여 별도의 인덱스를 작성합니다.

데이터를 추가하면 이러한 구조 (노드 테이블과 인덱스) 모두에 항목이 추가 될 수 있지만 데이터를 제거하면 인덱스에서 데이터 만 제거됩니다. 따라서 노드 테이블에서 삭제되지 않기 때문에 오래된 데이터를 삭제하더라도 노드 테이블은 계속 증가합니다. 이 뒤에

실제적인 이유는 두 가지이다 : 노드 조회에 ID가 빠른 파일 따라서 스캔 데이터가 삭제되는대로 노드의 일부를 삭제할 수 없습니다 그래서

  1. 정수 ID가 부분적으로 파일 오프셋을 인코딩 모든 노드 ID를 다시 쓰지 않아도 됨 - 즉, ID -> 노드 방향의 노드 테이블은 순차 파일입니다 (삽입을 매우 빠르게하는 데 도움이 됨)
  2. 데이터가 삭제되면 노드가 여러 번 사용되는지 여부를 알 수 없습니다 완전한 데이터베이스 스캔을 수행하지 않아도됩니다. 따라서 노드 테이블 항목을 먼저 삭제해야하는지 여부를 알 수 없습니다. 이를 수행 할 수있는 유일한 방법은 시스템에 복잡성을 추가하고 추가 및 삭제 속도를 늦추는 전체 참조 계산 방식을 구현하는 것입니다.

면책 조항 - 난이 최선의 이해를 반영하고 완전히 정확하지 않을 수 있도록 하지만는 TDB 구성 요소에 개인적으로 어떤 일을 해본 적이 한 예나 프로젝트의 커미터입니다.

+0

감사합니다.메일 링리스트를 확실히 확인해 보겠습니다. 제거가 반드시 테이블 크기를 줄이지는 않지만 이해할 만하다. 다시 한번 감사드립니다. – paul

관련 문제