2010-02-02 15 views
7

Wydaje mi się, że jeden sposób przechowywania danych w B-drzewie jako plik może być efektywnie wykonany przy pomocy C pliku binarnego z sekwencją (tablicą) struktur, przy czym każda struktura reprezentuje węzeł. W ten sposób można połączyć poszczególne węzły z podejściem, które będzie podobne do tworzenia list połączonych za pomocą tablic. Ale wtedy problem polegający na usunięciu węzła byłby usunięciem węzła, ponieważ wymazanie tylko kilku bajtów w środku ogromnego pliku nie jest możliwe.C/C++: Jak przechowywać dane w pliku w drzewie B

Jednym ze sposobów usuwania może być śledzenie "pustych" węzłów do momentu osiągnięcia progowego odcięcia, a następnie utworzenie kolejnego pliku, który odrzuci puste węzły. Ale to jest nużące.

Czy istnieje lepsze podejście z punktu widzenia prostoty/wydajności do usuwania lub nawet reprezentowania drzewa B w pliku?

TIA, -Sviiya

+0

Żeby było jasne, pytasz o B-drzewa lub drzewa binarne. –

+0

B-drzewa. Ale myślę, że w celu przechowywania plików, problem byłby taki sam? – user203405

+0

BTW, C i C++ to dwa różne języki. Jeśli piszesz kod, który działa na obu, dodaj znacznik C++. –

Odpowiedz

2

Zrobiłem bardzo szybkie wyszukiwanie i wykopali to: http://people.csail.mit.edu/jaffer/WB C Źródło: http://cvs.savannah.gnu.org/viewvc/wb/wb/c/ - wydaje się oferować B-Tree stylu baz danych dyskowych - chociaż przyjrzeniu „usuń .c "wydawało się sugerować, że jeśli usuniesz węzeł, wszystko zostanie usunięte - jeśli to jest prawidłowe zachowanie, to brzmi jak coś, co może pomóc?

Również - B-drzewa są często używane w systemach plików - czy nie mógłbyś spojrzeć na jakiś kod systemu plików?

Moja własna inklinacja to system plików - jeśli masz drzewo B o stałym rozmiarze, za każdym razem, gdy "usuniesz" węzeł zamiast próbować usunąć odniesienie, po prostu ustaw wartość, co oznacza nic w twoim kodzie. Następnie uruchom wątek czyszczący, który sprawdza, czy ktoś ma otwarty plik do czytania, a jeśli wszystko jest w porządku, blokuje plik i porządkuje.

+0

Dzięki za referencje, Ninefingers. :) Na pewno będę musiał to przeczytać. Ponieważ usuwanie może być częste, rozliczanie ich powinno być wydajne. Spodziewam się, że niektóre z tych operacji mogą być opóźnione, ale muszę przeczytać kod, aby zobaczyć, czy jest lepsza opcja. Mam też zamiar użyć go później do systemu plików, ale wtedy implementacja byłaby inna, ponieważ rozmiar byłby stały. Tak więc projekt będzie musiał wziąć to pod uwagę. – user203405

+0

Hmm Zgadzam się. Ten kod twierdzi, że robi to, czego potrzebujesz, i pobieżne spojrzenie na viewcvs sugeruje, że może - bez siadania i odbudowywania twojego problemu, chociaż trudno powiedzieć ... Myślę, że systemy plików robią tylko "zero" elementów, które chcą usunąć i przypisać do dowolnego zero elementu, ale mógłbym mieć to źle. Tak czy inaczej, jeśli to nie pomoże, proszę ponownie otworzyć pytanie! –

+0

Pytania odpowiadają na to, czego szukałem, a już dowiedziałem się o skracaniu pliku, a przez to omijany jest problem usuwania danych ze środka. Dzięki. :) – user203405

1

Możesz również użyć DB Berkley. Działa dobrze z programami C i implementuje drzewo B +.

+0

Tak, ale chcę napisać własny kod, aby uzyskać prawdziwy klimat. :) – user203405

+0

Zgadzam się. Pisanie na własną rękę jest w porządku, aby uzyskać prawdziwy nastrój. BBD jest bardzo zaawansowaną bazą danych i zapewnia wiele funkcji, których normalny kod by nie spełniał. W przypadku rzeczywistego wdrożenia produktu wybrałbym BDB. Wymyślanie koła byłoby tu trudne. – Jack

4

Do implementacji B-drzew w pliku można użyć przesunięcia pliku zamiast wskaźników. Możesz także zaimplementować "menedżera pamięci plików", aby móc ponownie używać usuniętych elementów w pliku.

Aby w pełni odzyskać usunięte bloki w pliku B-Tree, konieczne będzie odtworzenie drzewa B w nowym pliku. Pamiętaj również, że większość systemów operacyjnych nie ma metod skracania plików. Przenośną metodą obcinania pliku jest napisanie nowego pliku i zniszczenie starego.

Inną propozycją jest podział pliku na partycję B-Tree i partycję danych (elementów). Partycja B-Tree będzie zawierała strony. Strony liści będą zawierały przesunięcia do elementów danych. Partycja danych będzie sekcją w pliku zawierającym elementy danych. Możliwe, że utworzysz więcej niż jedną partycję i partycje mogą być przeplatane.

Spędziłem dużo czasu, grając z opartym na plikach B-Tree, aż dałem sobie spokój i zdecydowałem się pozwolić, aby program bazy danych (lub serwer) obsługiwał dane dla mnie.

+0

Brzmi interesująco. To moje ćwiczenie polega na uzyskaniu pewnej ekspozycji na kodowanie niskopoziomowe. Interesuję się głównie systemami opartymi na systemie Linux i obsługuję obcinanie plików. :) – user203405

+0

Większość systemów operacyjnych * do * posiada funkcje do obcinania plików. W systemach Linux, BSD, Windows możesz ustawić długość pliku na dowolną. –

Powiązane problemy