7

Potrzebuję napisać aplikację C++, która odczytuje i zapisuje duże ilości danych (więcej niż dostępna pamięć RAM), ale zawsze w sekwencyjny sposób.Szukasz łatwego w użyciu osadzonego magazynu wartości klucz-wartość dla C++

Aby zachować dane w przyszłym i łatwym do udokumentowania sposób, używam bufora protokołów. Bufor protokołu nie obsługuje jednak dużych ilości danych.

Moje poprzednie rozwiązanie polegało na utworzeniu jednego pliku na jednostkę danych (i zapisaniu ich wszystkich w jednym katalogu), ale nie jest to szczególnie skalowalne.

Tym razem chciałbym spróbować użyć wbudowanej bazy danych. Aby mieć podobną funkcjonalność, wystarczy przechowywać odwołania do kluczy-> wartości (stąd sqlite wydaje się przesadą). Wartości będą wynikiem serializacji binarnej z bufora protokołów.

Oczekuję, że baza danych będzie zarządzać kwestią "co zachować w pamięci, co przenieść do dysku", "jak skutecznie przechowywać dużą ilość danych na dysku", a najlepiej, aby zoptymalizować mój sekwencyjny odczyt wzorce (czytając przed ręką kolejne wpisy).

Wyszukiwanie alternatyw Byłem zaskoczony brakiem alternatyw. Nie chcę przechowywać bazy danych w oddzielnym procesie, ponieważ nie potrzebuję tego oddzielenia (to wyklucza ponowne).

Jedyna dostępna opcja to Berkeley DB, ale ma nieprzyjemny niski poziom C api. Najlepszą opcją, jaką znalazłem, było stldb4 na szczycie Berkeley DB. Interfejs API wydaje się całkiem niezły i pasuje do moich potrzeb.

Jednak się martwię. stldb4 wydaje się dziwne (ma zależności od rzeczy libferris), rozwiązanie niezamieszkane (ostatnie wydanie rok temu), dla problemu, który musiałbym być dość powszechny.

Czy ktoś z was ma lepsze sugestie dotyczące zarządzania tym problemem?

Dzięki za odpowiedzi.

Odpowiedz

5

Myślę, że znalazłem odpowiedź na mój problem.

nie zauważyłem, że Berkeley DB zapewnia dwa API dla C++:

Ten STL API zapewnia STL kompatybilnych wektorów i mapy abstrakcje, które dają bezpośredni dostęp do bazy danych. W ten sposób staje się możliwe value = data_container[key].

To wydaje się być najlepszym rozwiązaniem dla mnie; używanie Berkeley DB STL API bezpośrednio razem z buforami protokołów.

1

BerkleyDB wydaje się pasować do Twoich potrzeb. Oczywiście, jego interfejs API jest nieco niezręczny, ale jeśli wolisz mieć ładne API, to może być lepszym rozwiązaniem, nawet jeśli myślę, że jego wydajność może nie być tak dobra.

Powiązane problemy