Zapis do pliku "segmentami"

dział ogólny

Zapis do pliku "segmentami"

Nowy postprzez Slynx » sobota, 27 sierpnia 2011, 12:02

Mam taki problem przy pracy na dużych plikach (~1GB).
Załóżmy, że do pliku będą zapisywane mniejsze segmenty (~10 MB). Każdy z tych segmentów powinien mieć swój numer żeby można było zidentyfikować jego kolejność. Nie mogę od razu zapisywać tych segmentów w poprawnej formie (czy ułożyć z nich właściwy plik), bo segmenty mogą być w nieodpowiedniej kolejności lub nie zawsze jest pewność, że dany segment jest prawidłowy. Dodatkowo. Powinna być możliwość szybkiego odczytu danego segmentu, najlepiej bez konieczności przelatywania przez cały plik w poszukiwaniu odpowiedniego nagłówka (danego segmentu - jakoś trzeba go zidentyfikować).

To co ja wymyśliłem...
Pomyślałem, że można by zrobić coś takiego jak indeks segmentów znajdujących się w pliku, taki nagłówek pliku, ze spisem segmentów + pozycja od której segment się zaczyna. Problemem okazała się nieznana wielkość takiego nagłówka (tak na prawdę nie wiadomo ile tych segmentów będzie), czy ten nagłówek w ogóle będzie (może zostać usunięty czy coś, a jakoś trzeba ustalić gdzie się kończy), no i każdorazowa zmiana pozycji każdego segmentu w strumieniu. Dodając nowy segment, dodajemy indeks + pozycję do nagłówka pliku, tym samym przesuwając pozycję wszystkich segmentów. Tak więc uznałem, że nie ma co kombinować i lepiej poprosić o pomoc kogoś bardziej doświadczonego :)

Główne założenia:
- Możliwość szybkiego znalezienia i "wycięcia" strumienia danego segmentu.
- Sprawdzenia liczby segmentów oraz czy dany segment znajduje się w pliku.
- Dodawanie, usuwanie segmentów, zamienianie (może być potrzeba zamiany uszkodzonego na poprawny) tak by nie trzeba było odczytywać całego strumienia (czyli szukać segmentu).

(Pomyślałem, że można by zrobić nagłówek o stałej wielkości, np 10KB, wypełniając resztę np. kropkami, czy czymś takim. 10 KB przy założeniu wpisu np. "[HEADER]{12}{324543}{D}[/HEADER]" (nr segmenty, pozycja w pliku i jakaś dodatkowa opcja) (który ma maksymalną wielkość 50 bajtów) daje to możliwość wpisania ponad 200 segmentów.(Można powiększyć, np. do 100KB lub zamienić HEADER na np. HDR, by zwiększyć liczbę możliwych segmentów do zapisania).
Co o tym myślicie ?
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Zapis do pliku "segmentami"

Nowy postprzez polymorphism » sobota, 27 sierpnia 2011, 13:31

Pomysł z indeksami jest jak najbardziej ok, tylko żeś się zafiksował na umieszczenie ich jednym pliku z danymi. Indeksy zapisuj w oddzielnym pliku.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis do pliku "segmentami"

Nowy postprzez Slynx » sobota, 27 sierpnia 2011, 13:54

Tzn, założenie było, że wszystko ma być w jednym pliku, bo z drugiej strony, mógłbym zrobić katalog i umieszczać każdy segment w osobnym pliku. Właśnie przerwałeś mi gdy męczyłem się nad umieszczaniem tego w strumieniu. Takie "krojenie" by wyszedł nagłówek;p

W sumie ten plik z indeksami to nie taki zły pomysł. Może być jeden dla wszystkich plików, przecież nie trzeba robić oddzielnego pliku z indeksami dla każdego pliku z segmentami. Taka dodatkowa baza... Może być. Spróbuję to zrobić.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Zapis do pliku "segmentami"

Nowy postprzez Cyfrowy Baron » sobota, 27 sierpnia 2011, 14:06

Nagłówek pliku zawierający spis indeksów można umieścić zawsze na końcu tegoż pliku. Zapisujesz segmenty do pliku, a końcu oddzielasz sekcję segmentów od sekcji nagłówka i nagłówek dopisujesz do końca pliku. Po ponownym wczytaniu pliku, wczytujesz sam nagłówek do pamięci i usuwasz tenże nagłówek z końca pliku. Dopisujesz nowe segmenty, aktualizujesz nagłówek w pamięci i znów dopisujesz go do końca pliku. W ten sposób program zawsze może pobrać z pliku nagłówek i nie musisz się martwić o rozmiar tego nagłówka.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis do pliku "segmentami"

Nowy postprzez Slynx » sobota, 27 sierpnia 2011, 14:13

To w sumie niczym się nie różni, bo czy ja sobie ten nagłówek od nowa obrobię i dodam na końcu, czy po prostu dodam kilka kropek i umieszczę na początku, by rozmiar był ten sam... 100KB tymczasowego nagłówka na pliku 1GB to żadna różnica. Ale pomysł polymorphisma mi się podoba. Właśnie to robię, taka dodatkowa baza ze spisem segmentów. Wszystko trzymać w jednym miejscu.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Zapis do pliku "segmentami"

Nowy postprzez Cyfrowy Baron » sobota, 27 sierpnia 2011, 14:55

Co się tyczy pomysłu polymorphis'a, to coś bardzo podobnego zrobiłem w programie Babilon. Poszedłem jednak dalej i upakowałem plik z indeksami i plik z danymi w jednym archiwum ZIP. Program wczytuje strumieniowo - bez wypakowywania pliki z archiwum oddzielnie plik z indeksami i oddzielnie plik z danymi.

Slynx napisał(a):To w sumie niczym się nie różni, bo czy ja sobie ten nagłówek od nowa obrobię i dodam na końcu,


Jest różnica. Jeżeli dasz nagłówek na początku to po zmianie rozmiaru tegoż nagłówka będziesz musiał przetworzyć cały plik by dopisać nowy większy nagłówek.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości

cron