Binary Search nebo btree aktualizace index problém

hlasů
4

Představte si, že jste podal novou knihu každý den od autora. Kniha je nedokončená. Nemá ti, co se změnil či přidal.

Vaším úkolem je identifikovat změny a dodatky, a předat pouze ty spolu s vydavatelem (kdo nemá čas číst celou knihu každý den)

Pro účely tohoto problému, kniha se skládá z 1 m řádky ASCII textu a roste (vlastně MySQL zálohování souborů).

Můj současný myšlenkou je, aby bezpečné hash (SHA256 například) každého řádku (1k znaků) a uložit ji na HD. Vzhledem k tomu, hash je pouze 32bytes soubor je jen 32 MB.

Pak, když dostaneme další soubor zítra jdeme přes to řádek po řádku, vytváření nové hash pro každý řádek a porovnejte ji s hash z předchozího dne.

Když je proces ukončen bychom přepsat soubor hash připraven na další den.

Srovnání používá binární vyhledávání způsob řetězce porovnávat (> <operandy) To vrátí výsledek v průměru o čtyři iterací.

Nemám kódované indexový btree řešení dosud, ale jak byste řešit to?

Položena 30/10/2008 v 01:52
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
1

Chtěl bych použít diff .

Pokud bych potřeboval, aby jej v rámci svého vlastního programu, tak bych použít jeden z algoritmů pro nalezení nejdelší společnou podposloupnost dvou sekvencí, ošetřování každý soubor jako sled čar.

Odpovězeno 30/10/2008 v 01:58
zdroj uživatelem

hlasů
0

„Pak, když dostaneme další soubor zítra jdeme přes to řádek po řádku, vytváření nové hash pro každý řádek a porovnejte ji s hash z předchozího dne.“

Ho: 1m linie dnešních hash hodnoty ve srovnání s 1m řádky hodnot včerejší.

Ještě linky dostat vložení nebo odstranit? Pokud tomu tak není, je to jednoduchá množina paralelně čte aby zjistili, zda hash jsou různé.

Pokud existují přidává nebo odstranění, budete muset použít algoritmus diff určit rozsah změn.

Vše je to v pořádku. Není příliš obtížné realizovat.

V této souvislosti se vkládá nedává smysl.

Srovnání používá binární vyhledávání způsob řetězce porovnávat (> <operandy) To vrátí výsledek v průměru o čtyři iterací.

Je tam nějaký druh objednávání na hash hodnoty? Nebo nějaký stromová struktura?

Odpovězeno 30/10/2008 v 02:20
zdroj uživatelem

hlasů
0

Kniha 1 milion linek je obrovský: Existuje snad 30 - 50 řádek na stránku, takže buďme velkorysí a předpokládáme, 100 řádků na stránce, což znamená 10.000 stránky v knize.

Řádky 1 KB jsou také mnohem větší, než je normální; Základní čitelnost navrhuje nikde poblíž, že mnoho znaků na řádek. Hodláte hash linky až 1 KB, nebo kus souboru, do 1 kousky KB? Jeden problém s režimu je, že všechny opakované linky bude mít opakované hash; vám nikdy nemůže zjistit, kdy byla přidána nebo odstraněna jedna z těchto linek.

Ty by pravděpodobně, je třeba upozornit vydavatele vymazaných řádků taky.

Stejně jako u Glomek bych použít diffna soubor. Pokud budete udržovat soubor pod RCS nebo CVS kontrolou, měli byste právě aktuální verzi souboru a diff mezi předchozími verzemi uloženými. S tímto, měli byste být schopni poskytnout kumulativních diffy přes týden či měsíc taky.

A já pravděpodobně nebude vyvíjet vlastní B-Tree indexování.

Odpovězeno 30/10/2008 v 02:23
zdroj uživatelem

hlasů
0

roztok byste popsat, je poněkud podobný algoritmu rsync. jeden důležitý bod je, že rsync musí uznat stávající kousky kdekoli v cílovém souboru, u některého odsazení od původní.

pokud jsou soubory opravdu rekordně strukturovaná, můžete zjednodušit trochu, jako byste navrhnout. Pokud tomu tak není, je potřeba průběžný kontrolní součet.

Také, musíš uznat reorderings? nebo jen inzercí / delecí / náhrady?

nejvíce generický případ je plný rsync algoritmus, který vypadá takto:

  • Definice parametrů:

    1. zvolit velikost bloku 512, nebo 1k obvykle pracují v pořádku.
      • zvolit ‚silnou‘ kontrolní součet. něco jako z MD4 nebo tak. 64bit je spousta.
      • vybrat ‚slabé‘ valivý kontrolní součet. ten, který vám umožní ‚odčítání‘ ocas byte a ‚add‘ hlava byte dostat kontrolního součtu bloku 1 byte dopředu. obvykle 16-bit kontrolní součet funguje ok.
  • podpis starého souboru:

    1. traverz celého starého souboru, v každém bloku vypočítat jak slabé a silné kontrolní součty. s 16 a 64 bitů kontrolní součty a 512byte bloků, to znamená, že 10bytes na bloku, nebo 20 KB za megabyte. To je ‚podpis‘
  • vytvořit ‚záplatu‘ s novým souborem, a podpis starého souboru:

    1. načtení podpisu starého souboru, nejlepší je hash tabulka, se slabými kontrolní součty jsou klíče, silné kontrolní součty a blok pozice jsou hodnoty.
      • přečíst první blok nového souboru
      • výpočet slabé kontrolní součet načteného bloku
      • zkontrolujte hash tabulky, zda je slabý kontrolní součet je tam.
      • je-li nalezen, výpočet silnou kontrolní součet a porovnávat s tím nalezený v hash
      • pokud odpovídají oba kontrolní součty, označit jako ‚ho‘ s odkazem bloku v hash, postoupit celou jednu velikost bloku a vrátit se ke kroku 3
      • kdyby nebylo silné kontrolní zápas, nebo je-li slabé kontrolní nebyl v hash ‚válce‘ slabé kontrolní součet, který je po bloku ‚přidat‘ další byte, a ‚odčítání‘ první byte z ocas.
      • přidat byte ‚odečtena‘ od ocasu do seznamu ‚nových‘ bytů v náplasti
      • vrátit se ke kroku 4
  • aplikovat náplast na starý soubor

    1. dále jen ‚náplast‘ je seznam ‚nových‘ bajtů, které vysadil při odvalování kontrolní součet, plus seznam ‚ho‘ bloky, které odpovídají na starém souboru.
Odpovězeno 30/10/2008 v 02:34
zdroj uživatelem

hlasů
0

To je technika používaná pro kumulativní zatížení na datovém skladu. V situaci, kdy nemají schopnost identifikovat změněná data do zdrojového systému, můžete si vzít snímek dat a porovnat ji se svým posledním snímkem identifikovat rozdíly. Tato technika ještě dostane zmínku v Ralpha Kimballa knihy na toto téma a je používán v aplikaci jsem se podílel na designu.

Budete potřebovat hash algoritmu s velmi širokým klíčem, protože tento přístup je náchylná k narozeninám útokům . MD5 nebo některý z rodiny SHA by bylo dobré. To také není schopen detekovat delece bez post-procesu, který prochází tím rozdílem, hledá chybějící přirozené klíče. Tento výpočet ve skutečnosti musí být informováni o struktuře tabulky.

Odpovězeno 30/10/2008 v 09:44
zdroj uživatelem

hlasů
0

Jeden problém s režimu je, že všechny opakované linky bude mít opakované hash; vám nikdy nemůže zjistit, kdy byla přidána nebo odstraněna jedna z těch řádků

Velmi dobrý bod, ale není problém. Opakovaný linka je duplikát a všechny duplicity budou odstraněny v další fázi zpracování. Takže ano, máte pravdu, ale to není problém.

„Diff“ link mě vezme na stránku s popisem toho, co jsem předpokládat je aplikace? Neexistuje žádný odkaz ke stažení, není v žádném jazyce žádný kód ... Co jsem zde chybí?

Někteří z vás hovořili o úrovni byte zrnitosti. To není potřeba. pouze linkový zrnitost je nutný, protože pokud došlo ke změně nic na trati, celá linka (záznam) musí být přepracován becasue jakákoliv změna v řadě ovlivňuje celý řádek.

Takže jsme porovnávání řádků cca 1000 znaků (ne binární), ve dvou souborech (dnešní snímek a včerejšky momentka), které jsou každý cca 1m linky.

Takže pomocí bezpečného hash jako SHA256 (MD5 má dojít ke kolizi a je pomalý ve srovnání) Nemohu zpracovat asi 30MB / sec na mém notebooku HO. Server samozřejmě bude žvýkat přes to mnohem rychleji.

Takže v případě, že soubor je arond 1GB, pak dělat všechny hases trvá asi 33sec a čtení 1Gb soubor pomocí Windows Page paměti trvá asi 30 sekund. ne hrůzný

Nyní máme dvě matice hashs představujících řádky v každém souboru. Pokud budeme třídit, můžeme nyní použít binární vyhledávání, takže jsme iteraci svou cestu prostřednictvím nových souborů hashs hledají zápas ve starých souborů hashs. Pokud nemáme najít to, že řádek je přidán do souboru změn.

Mějte na paměti, že tato kniha linií (starší databáze) je v každém aspektu neznámá. Neexistuje žádná záruka, provoz linek, umístění změn, typ změn.

Tyto návrhy čtení Foreward stránku po stránce je dobrá, ale předpokládá, že tyto dva soubory jsou ve smae pořadí až dokud první změny. To nelze předpokládat. Řádky (řádky) mohou být v libovolném pořadí. Také výběru libovolný velikost bloku porušuje zrnitost čáry. Pro účely tohoto úkolu, linky jsou neměnné.

Od té výborné odkaz na invrementa zatížení: File Porovnání Zabrat: Tato metoda je také známá jako metoda snímek diferenciálu. Tato metoda funguje tak, že vedení před a po obrazy souborů, které jsou předmětem zájmu datového skladu. Záznamy jsou v porovnání s najít změny a záznam klíče jsou ve srovnání se najít vložek a odstraní. Tato metoda je nejvhodnější v případě starších systémů vzhledem k tomu, že spouští většinou neexistují a protokoly transakcí jsou buď neexistují, nebo ve speciálním formátu. Vzhledem k tomu, většina starších databází mít nějaký mechanismus pro ukládání dat do souborů, tato metoda vytváří pravidelné momentky a pak porovnává výsledky produkovat záznamy změny. Jistě, všechny problémy statické zachycení jsou zde přítomny. Přidané složitost je představen na výzvu porovnání celé řady informací a klíčů identifikace a přizpůsobení. Tato technika je velmi složitý a obvykle není žádoucí, ale v některých případech, může být jediným řešením.

To je nejdůležitější: Jak jsme se pokračovat do říše terabyte datových skladů, bude možnost sestavení datového skladu z nuly na každou noc jít cestou dinosaura. Logické a efektivní přístup k aktualizaci datového skladu zahrnuje nějakou formu kumulativní aktualizaci strategie.

Takže myslím, že jsem na správné cestě pak? Index btree by neměla dovolit výhodu?

Odpovězeno 31/10/2008 v 08:47
zdroj uživatelem

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