Binary Search lub btree aktualizacja indeksu problem

głosy
4

Wyobraź sobie, że jesteś podał nową książkę codziennie od autora. Książka jest w toku. On nie mówi ci, co on zmienione lub dodane.

Twoim zadaniem jest zidentyfikowanie zmian i uzupełnień, i przekazać tylko te wraz z wydawcą (którzy nie mają czasu, aby przeczytać całą książkę codziennie)

Dla celów tego problemu, książka składa się z 1 mln linii tekstu ASCII i rośnie (właściwie kopia zapasowa plików MySQL).

Mój obecny pomysłem jest stworzenie bezpiecznego hash (SHA256 na przykład) każdej linii (1k znaków) i przechowywać je na HD. Ponieważ mieszania jest tylko 32bytes plik jest tylko 32MB.

Potem, gdy otrzymujemy następny plik jutro idziemy wzdłuż linii jej przez linię, tworząc nowy hash dla każdej linii i porównując ją do mieszania z poprzedniego dnia.

Po zakończeniu procesu możemy nadpisać plik hash gotowy do następnego dnia.

Porównanie używa binarny metoda wyszukiwania sznurka Porównaj (> <argumenty) to zwraca wynik w średnio czterech iteracji.

Nie kodowane rozwiązanie indeksu btree jeszcze, ale w jaki sposób uporać się z tym?

Utwórz 30/10/2008 o 01:52
źródło użytkownik
W innych językach...                            


6 odpowiedzi

głosy
1

Użyłbym diff .

Gdybym potrzebne do wdrożenia go w moim programie, chciałbym użyć jednego z algorytmów znajdowania najdłuższy wspólny podciąg dwóch sekwencji, traktując każdy plik jako ciąg linii.

Odpowiedział 30/10/2008 o 01:58
źródło użytkownik

głosy
0

„Wtedy, gdy mamy następny plik jutro idziemy wzdłuż linii jej przez linię, tworząc nowy hash dla każdej linii i porównując ją do mieszania z poprzedniego dnia.”

Got it: Linie 1M dzisiejszych wartości hash porównaniu z wartościami linii 1m wczorajszych.

Czy linie dostać wstawione lub usunięte? Jeśli nie jest to prosty zestaw równolegle czyta aby sprawdzić, czy hashe są różne.

Jeśli istnieją dodaje lub przeprowadzki, będziesz musiał użyć algorytmu diff do określenia zakresu zmian.

Wszystko w porządku. Nie jest zbyt trudne do zrealizowania.

W tym kontekście, co następuje bez sensu.

Porównanie używa binarny metoda wyszukiwania sznurka Porównaj (> <argumenty) to zwraca wynik w średnio czterech iteracji.

Czy istnieje jakiś rodzaj zamówienia do wartości hash? Lub niektóre struktury drzewa?

Odpowiedział 30/10/2008 o 02:20
źródło użytkownik

głosy
0

Księga 1 mln linii jest ogromna: są być może 30 - 50 wierszy na stronie, więc bądźmy hojni i zakładamy 100 wierszy na stronie, co oznacza 10.000 stron w książce.

Linie 1 KB są znacznie większe niż jest normalne; Podstawowym czytelność sugeruje nigdzie blisko, że wiele znaków w linii. Czy zamierzasz hash linie do 1 KB, lub fragmentu pliku w 1 KB kawałki? Jeden problem z programu jest to, że wszelkie powtarzające się linie miałyby powtarzającego hash; nigdy nie można określić, kiedy jedna z tych linii została dodana lub usunięta.

Byś zapewne trzeba powiadomić wydawcy usuniętych wierszy zbyt.

Jak z Glomek, chciałbym użyć diffw pliku. Jeśli zachować plik pod RCS lub CVS kontroli, trzeba tylko aktualną wersję pliku i dyferencjału między poprzednimi wersjami składowanych. Dzięki temu będzie można zapewnić skumulowane dyferencjału ponad tydzień lub miesiąc też.

I prawdopodobnie nie będzie rozwijać własne B-Tree indeksowanie.

Odpowiedział 30/10/2008 o 02:23
źródło użytkownik

głosy
0

opisać rozwiązanie jest nieco podobny do algorytmu rsync. Ważną kwestią jest to, że rsync musi rozpoznać istniejące fragmenty w dowolnym miejscu pliku docelowego, na dowolny odsunięcie od oryginału.

Jeśli pliki są naprawdę rekordowych skonstruowane, można uprościć trochę jak proponujesz. Jeśli nie, trzeba toczenia kontrolną.

Ponadto, nie trzeba rozpoznać reorderings? lub tylko insercje / delecje / zamienniki?

najbardziej generic sprawa jest pełen rsync algorytm, który wygląda tak:

  • Definicja parametrów:

    1. wybrać rozmiar bloku 512 lub 1k pracują zazwyczaj ok.
      • wybrać „silne” kontrolną. coś z MD4 lub tak. 64bits jest mnóstwo.
      • wybierz „słaby” toczenia kontrolną. jeden, który pozwala „odejmowanie” bajt ogon i „dodać” bajt głowy, aby uzyskać sumę kontrolną bloku 1-bajtowego przodu. Zazwyczaj suma kontrolna 16-bit działa ok.
  • podpis starego pliku:

    1. przesuwu całego starego pliku, w każdym bloku obliczania zarówno słabych i mocnych kontrolne. W 16 i 64 bitów sumy kontrolnej, a bloki 512 bajtów, co oznacza 10bytes na blok lub 20kb za megabajta. to jest „podpis”
  • stworzyć „łatę” z nowego pliku oraz podpis starego pliku:

    1. załaduj podpis starego pliku, najlepiej tabeli mieszania, ze słabymi sum kontrolnych jak klucze, silne kontrolne i pozycja bloku są wartości.
      • czytaj pierwszy blok nowego pliku
      • oblicz słaby kontrolną Listwa
      • sprawdź tabeli mieszania, czy słaby kontrolna ma.
      • w przypadku stwierdzenia, obliczyć sumę kontrolną silne i porównać z znalezionego w hash
      • jeżeli obie sumy kontrolne pasują do siebie, jak znak „got it” z odniesienia do bloku w hash, przejść jeden cały rozmiar bloku i wróć do kroku 3
      • jeśli silny suma kontrolna nie pasuje, lub jeśli słaby kontrolnej nie było w hash „Roll” słabych sumy kontrolnej, która jest „dodać” następny bajt po bloku, a „odjąć” pierwszy bajt z ogon.
      • dodać bajt „odejmowano” z ogona do wykazu „nowe” bajtów w plastra
      • wróć do kroku 4
  • zastosować poprawkę do starego pliku

    1. W „łatka” lista „nowych” bajtów, które odpadły podczas toczenia sumę kontrolną, a także listę „got it” bloki pasujących na starym pliku.
Odpowiedział 30/10/2008 o 02:34
źródło użytkownik

głosy
0

Jest to technika wykorzystywana do bieżących załadunku na hurtowni danych. W sytuacji, gdy nie masz możliwość identyfikacji zmienionych danych w systemie źródłowym, można wyjąć migawkę danych i porównać je ze swojej ostatniej migawki w celu identyfikacji różnic. Technika ta dostaje nawet wzmianki w książce Ralph Kimball w tej sprawie i jest używany w aplikacji brałem udział w projekcie.

Musisz algorytm mieszania z bardzo szerokim klawiszu co takiego podejścia jest podatny na atak urodzinowy . MD5 lub którykolwiek z rodziny SHA byłoby dobre. To również nie może wykryć delecje bez post-procesu, który przechodzi przez różnicę szuka brakujących kluczy naturalnych. To obliczenie faktycznie musi mieć świadomość struktury tabeli.

Odpowiedział 30/10/2008 o 09:44
źródło użytkownik

głosy
0

Jeden problem z programu jest to, że wszelkie powtarzające się linie miałyby powtarzającego hash; nigdy nie można określić, kiedy jedna z tych linii został dodany lub usunięty

Bardzo dobry punkt, ale nie problem. Powtarzające się linia jest duplikatem i wszystkie kopie zostały usunięte w następnym etapie przetwarzania. Więc tak masz rację, ale to nie jest problem.

„Diff” link prowadzi mnie do strony z opisem tego, co zakładam jest aplikacją? Nie ma Link do pobrania, nie ma kodu w dowolnym języku ... Co ja tu brakuje?

Niektórzy z was mówił o poziomie bajtów ziarnistości. To nie jest potrzebne. tylko liniowe ziarnistość jest wymagane, ponieważ jeśli coś na linii została zmieniona, cały wiersz (rekord) musi zostać ponownie przetworzone becasue wszelkie zmiany w obrębie linii wpływa na całą linię.

Więc jesteśmy porównywaniu linii około 1000 znaków (nie binarnych), w dwóch plikach (dzisiejsze i wczorajsze migawka migawka), które są każdorazowo ok linie 1m.

Więc przy użyciu Secure Hash jak SHA256 (MD5 ma kolizji i jest powolny w porównaniu) może przetwarzać około 30MB / s na moim laptopie HO. Serwer oczywiście będzie żuć przez to dużo szybciej.

Więc jeśli plik jest arond 1GB, a następnie wprowadzeniu wszystkich hases trwa około 33sec i odczytu pliku przy użyciu Windows Page 1 Gb pamięci trwa około 30sek. nie przerażające

Teraz mamy dwie tablice hashs reprezentujących linie w każdym pliku. Jeśli je sortować, możemy teraz użyć przeszukiwanie binarne, więc iteracyjne naszą drogę przez nowe pliki hashs szukających meczu w starych plików hashs. Jeśli my nie znaleźliśmy go, że linia jest dodawana do pliku zmian.

Należy pamiętać, że książka linii (baza Legacy) jest znana w każdym aspekcie. Nie ma żadnej gwarancji z rzędu linie, zmiany lokalizacji, rodzaju zmian.

Sugestii foreward czytając kolejne strony jest dobre, ale zakłada, że ​​oba pliki są w smae aby się aż do pierwszej zmiany. To nie można przyjąć. Linie (rzędy) mogą znajdować się w dowolnej kolejności. Wybierając również dowolny rozmiar bloku narusza ziarnistość linii. Dla celów tego zadania, linie są niezmienne.

Od tej doskonałej linku invrementa załadunku: Comparison File Przechwytywanie: Metoda ta jest również znana jako metoda różnicowej migawka. Metoda ta polega na zachowaniu przed i po obrazy plików, które są przedmiotem zainteresowania hurtowni danych. Zapisy są porównywane, aby znaleźć zmiany, a klawisze są porównywane rekord znaleźć wkładki i usuwa. Technika ta jest najbardziej odpowiednia w przypadku starszych systemów ze względu na fakt, że wyzwala zazwyczaj nie istnieją i dzienniki transakcji są albo nieistniejące lub we własnym formacie. Ponieważ większość starszych baz danych mają jakiś mechanizm dumpingu danych do plików, technika ta tworzy okresowe zrzuty, a następnie porównuje wyniki produkować Zmień rekordy. Z pewnością wszystkie problemy chwytania statycznego są tu obecne. Dodano złożoność jest wprowadzany przez wyzwaniu porównywania całych rzędów informacji oraz identyfikacji i dopasowywania kluczy. Technika ta jest złożona z natury i zwykle nie jest pożądana, ale w niektórych przypadkach może być jedynym rozwiązaniem.

Jest to najbardziej istotne tutaj: Jak postępować w sferę hurtowni danych terabajt, zdolność do odbudowy hurtowni danych od podstaw na nocne podstawie pójdą drogą dinozaurów. Logiczne i skuteczne podejście do aktualizowania hurtowni danych wymaga jakiejś formy pierwotnej strategii aktualizacji.

Więc myślę, że jestem na dobrej drodze wtedy? Indeks btree nie stać przewagę?

Odpowiedział 31/10/2008 o 08:47
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more