Mam plik tekstowy składający się z 13 mln słów, jaka jest najszybsza metoda przeszukiwania tego dokumentu tych 13 mln słów, tak abym w jak najkrótszym czasie otrzymywał wynik zapytania czy słowo istnieje i w której linii.
nie to nie jest słownik, i nie są ułożone alfabetycznie.
posortować, zamienić płaski plik na drzewo, wcisnąć do bazy
Jeżeli nie jest posortowane to nie istnieje metoda szybsza niż sprawdzanie słów po kolei, jęsli jest posortowane to możesz szukać tak jak w książce telefonicznej. Możesz zawsze zrobić swoją wersję - posortowaną. Albo ładować do pamięci i wtedy sortować, ale nie widzę sensu robienia z tego drzewa, ja bym użył posortowanej tablicy.
- Podziel plik na 26 plików - każdy zawierający początkowe litery alfabetu: A.ini, B.ini ... Z.ini
- Każdy plik z pierwszą literą alfabetu, podziel na kolejne pliki o konkretnej długości: A1.ini, A2.ini ... A25.ini
Szukasz słowa: test
Wiesz, że pierwsza litera to T i jest to 4 znakowy wyraz, więc szukasz tego słowa w pliku T4.ini
Dobry sposób Opi, a co do wyszukiwania po kolei to nie ma sensu, bo za długo zleci..
Dobry sposób? Chyba na marnowanie dysku.
Najlepiej zrobić plik zawierający posortowaną listę słów oddizelonych np. #13 albo #0. A potem czytać metodą dziel i zwyciężaj. Sposób Opiego to najlepsza droga do zapchania dysku.
13 milinów słów = 13 000 000
Jedno słowo = około 8 znaków (bajtów)
13 000 000 * 8 = 104 000 000 bajtów
104 000 000 bajty = niecałe 100 99 GB
Chyba, że popełniłem błąd w obliczeniach.
Autor nie napisał, że jest tam 13 mln różnych słów ale napisał, że potrzebuje dostać jako wynik linię w której dane słowo występuje, a nie tylko informację czy plik istnieje.
Jeśli masz zrobić jakąś usługę indeksującą plik to możesz np posortować go, keszować zapytania w pamięci i zastosować np filtr Blooma do odsiewania zapytań do pliku.
Też jestem zainteresowany tym tematem.
Mam na dysku słownik ~35mb. Słowa w nim zapisane są mniej więcej w taki sposób:
aa
aaa
abace
abaci
abacie
abadańscy
abadańska
abadańską
abadański
abadańskich
abadańskie
Są posortowane alfabetycznie. Czy istnieje jakiś szybki sposób, na wyszukiwanie tych słów z tego słownika? (Podczas wpisywania tekstu w richedicie).
Oczywiście, aby zużycie RAM-u było minimalne.
Niektóre programy mają tą funkcję sprawdzania słów i odbywa się to u nich bardzo szybko, lecz korzystają ze słownika ~4mb a słowa zapisane w nim są w formacie typu:
a
A
aa
AA
aaa
Aalborg/Q
Aalto
AAN
AAP
Aara/M
Aare
Aargau
Aarhus
Aaron/NOosT
Aar/Q
Aasen/NOosT
ab
Ab
Abacja/M
abadanka/MmN
Abadan/Q
abadańczyk/NOqsT
abadański/bXxYc
Abaddon/O
abaka/MnN
abakanka/mMN
abakan/NQsT
- do tego dochodzi mały pliczek *aff 240kb wewnątrz:
SET ISO8859-2
TRY aioeznrwcysptkmdłulj±gbhę¶ćóżfńĽvqxAIOEZNRWCYSPTKMDŁULJˇGBHʦĆÓŻFѬVQX
PFX b Y 1
PFX b 0 nie .
SFX a Y 6
SFX a e ych [^i]e
SFX a e ymi [^i]e
SFX a e ym [^i]e
SFX a e ch ie
SFX a e m ie
SFX a e mi ie
SFX c Y 1
SFX c i u i
SFX F Y 442
SFX F c głem lec
SFX F c głe¶ lec
SFX F c gł lec
.
.
.
Wie ktoś w jaki sposób to funkcjonuje?