Mam listę ciągów zawierających około 7 milionów elementów w pliku tekstowym o rozmiarze 152 MB. Zastanawiam się, jaki może być najlepszy sposób wdrożenia funkcji, która pobiera pojedynczy ciąg znaków i zwraca, czy znajduje się na liście łańcuchów.Dopasowywanie ciągi znaków w dużym pliku tekstowym?
Odpowiedz
Czy będziesz musiał dopasować się do tego pliku tekstowego kilka razy? Jeśli tak, to utworzę HashSet<string>
. W przeciwnym razie po prostu przeczytaj to wiersz po linii (zakładam, że jest jeden ciąg na linię) i zobacz, czy pasuje.
152 MB ASCII kończy się jako ponad 300 MB danych Unicode w pamięci - ale w nowoczesnych komputerach ma dużo pamięci, więc utrzymanie całej serii w HashSet<string>
spowoduje bardzo szybkie powtórzenie wyszukiwania.
Bezwzględna Najprostszym sposobem, aby to zrobić, to prawdopodobnie korzystać File.ReadAllLines
, mimo że stworzy tablicę które następnie zostaną usunięte - nie wielki dla użycia pamięci, ale chyba nie jest tak źle:
HashSet<string> strings = new HashSet<string>(File.ReadAllLines("data.txt"));
...
if (strings.Contains(stringToCheck))
{
...
}
Zależy od tego, co chcesz zrobić. Gdy chcesz powtórzyć wyszukiwanie pasujących wyników, załadowałem cały plik do pamięci (do HashSet
). Tam bardzo łatwo wyszukiwać mecze.
Właściwie muszę wyszukiwać raz za razem. Ale zamierzam użyć tego w aplikacji internetowej. Czy pamięć stanie się problemem przy wielu żądaniach? –
@Taz: Liczba żądań jest nieistotna, tak długo jak budujesz swoją hashmap tylko raz :) Zgodnie z dokumentacją: * Wszelkie publiczne statyczne elementy tego typu są bezpieczne dla wątków *, więc nie ma tu problemu, – tanascius
@Taz : tanascius ma rację. Załaduj go raz i powinieneś móc wyszukiwać (używając wielu równoczesnych wątków, nawet - o ile nic nie pisze) bez dodatkowego wykorzystania pamięci. Tak długo, jak twój serwer ma wystarczająco dużo pamięci, aby pomieścić zestaw, to jest droga do zrobienia. –