2013-01-03 7 views
6

Powiel możliwe:
What are important points when designing a (binary) file format?Czy istnieje odniesienie/zasób dotyczący projektowania struktury pliku danych?

Zamierzam opracować program, który będzie przechowywać dane w pliku.

Plik może być duży. Dane w pliku są zasadniczo skomponowane z rekordami o zmiennej długości. I potrzebuję losowego dostępu do rekordów.

Po prostu chcę przeczytać niektóre materiały/książki o tym, jak zaprojektować strukturę pliku danych. Ale nie mogę jeszcze znaleźć.

Wszelkie sugestie są mile widziane.

+0

jakie zmienne będą w danych? długie struny z różnymi zapisami? – billz

+0

Nie jest to duplikat, ponieważ to pytanie jest bardziej szczegółowe na temat jego potrzeby (losowy dostęp do rekordów o zmiennej długości). – MSalters

+1

@limi: Dlaczego zdecydowałeś się na plik? W tym celu istnieją bazy danych, które implementują już wszystkie wymagane logiki, aby zmapować dane na stałe. – MSalters

Odpowiedz

2

opisać problemem jest tematem teorii Database.

Każdy przyzwoity tekst na ten temat powinien dać ci kilka dobrych pomysłów. Standardowy tekst z uni było:

Fundamentals of Database Systems- Elmasari & Nava (PDF)(Amazon)

Innym podejściem jest użycie pamięci mapowane tablicę kodowanym, spójrz na moje bountied answer to a similar question

Jeszcze innym podejściem jest użycie protokołu binarnego jak Google protobuf i "wyślij" swoje dane do pliku podczas pisania i "otrzymaj" je podczas pisania.

1

Czy jest jakiś powód, dla którego nie rozważasz umieszczenia tych danych w trwałym magazynie bazy danych, takim jak mysql? Te systemy są zbudowane, aby poradzić sobie z przypadkowym dostępem do danych z odpowiednimi indeksami, aby przyspieszyć pobieranie danych. Dodatkowo podczas odczytu z pliku, będziesz musiał przeczytać cały plik, aby uzyskać to, czego chcesz, ponieważ nie ma indeksów i języka zapytań.

Co więcej, są one wyposażone w systemy zapewniające dostęp do tych samych danych wielu procesom uruchomieniowym bez utraty danych. Zapewniało odzyskanie danych w przypadku niespójności.

Po prostu przechowywanie jest prostą częścią, na tym się nie kończy. W końcu będziesz musiał dostarczyć wszystkie inne rozwiązania. Lepiej wykorzystaj to, co jest dostępne.

+0

lub możesz po prostu utworzyć archiwum zip i umieścić w nim wszystko, jest to główna koncepcja przyjęta przez pliki .jar lub pliki .apk lub miliardy innych podobnych rozwiązań. – user1824407

+0

zip to archiwum. ale pytanie brzmi: "I potrzebuję losowego dostępu do rekordów. Dlatego zasugerowałem mysql ... –

+0

... a tytuł mówi o pliku danych ... prawdopodobnie to pytanie wymaga wyjaśnienia, o ile wiem, że mogłem również sugeruję serializację dla tego – user1824407

2

Jeśli odpowiedź, której szukasz, brzmi: "co czytać w książce", nic na to nie poradzę.

Jeśli "jak to zrobić" może być również dobre dla ciebie, mam pewne sugestie.

Jednym z dobrych rozwiązań jest rozwiązanie zaproponowane przez Srykar; Dodałbym tylko, że użyłbym SQLite zamiast MySQL. Jest to biblioteka C o otwartym kodzie źródłowym, którą możesz umieścić w swoim programie. Pozwala przechowywać dane w bazie danych w taki sam sposób, jak w przypadku instrukcji SQL, ale zamiast tego wywołuje funkcje biblioteki C. W twoim przypadku możesz zachować wszystko w pamięci, a następnie zapisać dane na dysku we właściwym czasie.

referencyjny: http://www.sqlite.org

Inną opcją jest stary "zrób to sam sposób". Mam na myśli: nie ma nic bardzo skomplikowanego w przechowywaniu twoich danych do pliku (chyba że twoje dane są bardzo uporządkowane, ale w tym przypadku skorzystam z opcji nr 1).

Zapisujesz plan, w jaki sposób chcesz utworzyć strukturę pliku. I postępujesz zgodnie z tym planem zarówno podczas zapisywania pliku na dysk, jak i podczas odczytu go ponownie przechowującego dane w pamięci.

Jeśli masz zapisy n. Napisz n na dysk, a następnie napisz każdy rekord.

Jeśli każdy rekord ma zmienną długość, wpisz długość każdego rekordu przed zapisaniem rekordu.

Mówisz o "losowym dostępie" w swoim pytaniu. Prawdopodobnie oznacza to, że plik jest bardzo duży iw czasie dostępu chcesz odczytać z dysku tylko ten fragment, który cię interesuje.

Jeśli tak, planujesz zbudować indeks; indeks wskaże przesunięcie każdego elementu w bajtach od początku pliku. Zapisz indeks na początku pliku, a następnie zapisz dane.

Po odczytaniu pliku rozpoczynającego czytanie indeksu, uzyskaj przesunięcie do potrzebnych danych i odczytaj tę część pliku.

Są to bardzo podstawowe przykłady, tak aby uzyskać pomysł ...

nadzieję, że pomoże!

+0

Dzięki, po pewnym dochodzeniu, myślę, że SQLite jest najlepszym wyborem dla mnie. Opracowanie własnego formatu pliku nie jest warte wysiłku, aby wesprzeć usuwanie/wstawianie i jednocześnie uzyskać dobrą wydajność, jakość nie jest łatwa. – limi

Powiązane problemy