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.
- 1. Edycja pojedynczej linii w dużym pliku tekstowym
- 2. Znajdź zduplikowane ciągi w dużym pliku
- 3. Zastępowanie znaków w pliku tekstowym za pomocą pliku wsadowego
- 4. Dopasowywanie sekwencji kolejnych znaków w ciągu znaków
- 5. Wyszukaj i zamień ciąg znaków w bardzo dużym pliku.
- 6. Dopasowywanie wyrażenia regularnego z ciągiem znaków (nazwa pliku)
- 7. Dopasowywanie rozmytych ciągów znaków
- 8. rozpakuj ciągi znaków w javascript
- 9. wstawianie napisów w dużym pliku
- 10. Dopasowywanie ciągów znaków wieloznacznych w Ruby
- 11. Tokenizing ciągi znaków w C
- 12. Skrypty do wyświetlania wszystkich różnych znaków w pliku tekstowym
- 13. Usuwanie ostatnich dwóch znaków z każdej linii w pliku tekstowym
- 14. Dopasowywanie ciągów znaków w kolumnach w R
- 15. Jak interpolować ciągi znaków?
- 16. Resharper zlokalizuj złożone ciągi znaków
- 17. C# - Odczyt w dużym pliku tekstowym (150 MB) w polu tekstu sformatowanego
- 18. Jednostki testujące zlokalizowane ciągi znaków
- 19. Dopasowywanie znaków specjalnych i liter w regex
- 20. Probabalistyczne dopasowywanie ciągów znaków w języku Python
- 21. Jak wyodrębnić informacje między dwoma unikalnymi słowami w dużym pliku tekstowym
- 22. jak edytować lub zmienić lub zmienić pojedynczą linię w dużym pliku tekstowym z R
- 23. Dopasowywanie niewrażliwe na wielkość znaków w języku Marpa
- 24. C# Regex.Split - Subpattern zwraca puste ciągi znaków
- 25. Zastępowanie znaków w pliku
- 26. Policz wiersze w pliku tekstowym
- 27. Znajdź i zamień w dużym pliku
- 28. Wyrzucanie śmieci i ciągi znaków
- 29. Szablony i stałe ciągi znaków
- 30. Usuń ciągi znaków z TStringList
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. –