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.
Najszybszy sposób przeszukiwania pliku tekstowego.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 7923
posortować, zamienić płaski plik na drzewo, wcisnąć do bazy
- Rejestracja: dni
- Ostatnio: dni
- Postów: 196
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1034
- 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
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Kosmos
- Postów: 1571
Dobry sposób Opi, a co do wyszukiwania po kolei to nie ma sensu, bo za długo zleci..
- Rejestracja: dni
- Ostatnio: dni
- Postów: 196
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.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Wrocław
- Postów: 13042
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.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 107
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?
- Rejestracja: dni
- Ostatnio: dni
Wie ktoś w jaki sposób to funkcjonuje?
http://pwet.fr/man/linux/fichiers_speciaux/hunspell
ale rozwiązaniem jest po prostu użycie hunspella, a nie wynajdowanie słownika na nowo.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 107
Wielkie dzięki Azarien właśnie o takie coś mi chodziło, tylko mam jeden mały problem. Pobrałem sobie hunspella dla delphi, oraz wrzuciłem do niego polski słownik. Wszystko działa jak należy, gdy nie stosuję w nim polskich znaków. Jeżeli dany wyraz zawiera polskie znaki, to już go podkreśla za błędny, nawet gdy go napiszę bez polskich ogonków.
Pozdrawiam.