2012-06-18 13 views
6

Pracuję z prostym zbiorem danych Jeny, do którego importowany jest tylko jeden plik RDF o wielkości ~ 30 MB. W ramach aplikacji staram się umożliwić użytkownikom zapytanie do domyślnego wykresu (lub nazwanego wykresu) i wstawienie wynikowych triów z zapytania do nowego nazwanego wykresu. W tym celu używam instrukcji CONSTRUCT, aby utworzyć zestaw wyników potrójnych w postaci RDF, a następnie umieścić te trójki w nowym modelu (za pomocą QueryExecution.execConstruct()) i dodać ten model do zestawu danych. Wygląda na to, że działa ponownie, ponieważ zestaw danych otrzymuje nowy węzeł wykresu, a rozmiar dysku w folderze bazy danych TDB zwiększa się.Jak zmniejszyć rozmiar baz danych Jena bazujących na TDB?

Problem pojawia się tutaj, gdy próbuję usunąć nazwany wykres z zestawu danych. Za pomocą metody removeNamedName ("graphName") obiektu Dataset usuwam model z zestawu danych. Przyszłe zapytania dotyczące tej nazwy modelu wskazują, że został on pomyślnie usunięty. Rozmiar dysku w folderze bazy danych TDB pozostaje jednak taki sam, nawet po zakończeniu synchronizacji i zamknięciu.

Początkowo pomyślałem, że być może baza danych właśnie oznaczała wolne pliki, tak aby można je było zastąpić, gdy pojawiły się nowe dane, ale nie wydaje się, żeby tak było. Jeśli usuniemy nazwany wykres i zastąpię go natychmiast po tym samym uruchomieniu programu, folder nie będzie się powiększał, ale jeśli dodaję nowy nazwany wykres i usuniemy go w tym samym przebiegu, rozmiar folderu zwiększy się, a model zostanie powiększony. usunięcie nie zwalnia pamięci, co oznacza, że ​​po kilku uruchomieniach folder bazy danych ma pięcio- lub dziesięciokrotny rozmiar pierwotny, nie przechowując więcej danych.

Każdy wgląd lub pomoc byłaby wspaniała, jeszcze raz dziękuję.

Odpowiedz

6

Możesz uzyskać więcej informacji, pytając o listę adresową Jeny ([email protected]), ale postaram się odpowiedzieć. Możesz również zajrzeć na stronę TDB Architecture.

Baza TDB przechowuje dane, budując to, co nazywa się tabelą węzłów, która mapuje węzły RDF na 64-bitowe liczby całkowite i na odwrót. Następnie buduje oddzielne indeksy, używając tych liczb całkowitych, które pozwalają na wykonanie różnych skanów bazy danych niezbędnych do odpowiedzi na zapytania SPARQL.

Dodanie danych potencjalnie dodaje wpisy do obu tych struktur (tabela węzłów i indeksy), ale usunięcie danych powoduje jedynie usunięcie danych z indeksów. Z czasem tabela węzłów będzie nadal rosnąć, nawet jeśli usuniesz stare dane, ponieważ nie zostaną one usunięte z tabeli węzłów.

względów praktycznych za to są dwojakie:

  1. identyfikatory całkowite częściowo kodować przesunięcia plików tak identyfikator do odnośnika węzeł jest szybkie skanowanie plików zatem jak dane są usuwane nie można usunąć części węzła tabela bez konieczności przepisywania wszystkich identyfikatorów węzła, tj. tabela węzłów w ID -> kierunek węzła jest plikiem sekwencyjnym (pomaga bardzo szybko wstawiać inserty)
  2. Po usunięciu danych nie wiadomo, czy węzeł jest używany wielokrotnie bez wykonywania pełnego skanowania bazy danych. Dlatego nie można stwierdzić, czy wpis w tabeli węzłów powinien zostać usunięty w pierwszej kolejności. Jedynym realnym sposobem na to byłoby wdrożenie pełnego schematu zliczającego odniesienia, który sam w sobie zwiększyłby złożoność systemu i spowolnił dodawanie i usuwanie.

Zastrzeżone - Jestem committer nad projektem Jena ale nigdy nie zrobił żadnej pracy osobiście na komponencie TDB więc ta odzwierciedla moją najlepszą wiedzę i mogą nie być w pełni dokładne.

+0

Wielkie dzięki!Zdecydowanie sprawdzę listę mailingową, szkoda, że ​​usunięcie niekoniecznie zmniejsza rozmiar tabeli, ale jest zrozumiałe. Dzięki jeszcze raz. – paul

Powiązane problemy