Plik zawiera dużą liczbę (np. 10 miliardów) ciągów i musisz znaleźć duplikaty łańcuchów. Masz N liczbę dostępnych systemów. Jak znaleźć duplikaty?Znajdź zduplikowane ciągi w dużym pliku
Odpowiedz
Podziel plik na N części. Na każdej maszynie załaduj jak najwięcej części do pamięci i posortuj łańcuchy. Zapisz te porcje do pamięci masowej na tej maszynie. Na każdym komputerze połącz porcje w jeden strumień, a następnie połącz strumień z każdej maszyny ze strumieniem zawierającym wszystkie ciągi w porządku posortowanym. Porównaj każdy ciąg z poprzednim. Jeśli są takie same, jest to duplikat.
Aby scalić porcje w jeden strumień, musisz załadować wszystkie rekordy w pamięci. W przypadku pliku zapisu 1 mil, wszystkie rekordy 1 mil musiałby być w pamięci na ostatnim etapie scalania w powyższym algorytmie, prawda? Jeśli tak, to to pokonuje cel. –
@AndyDufresne "Aby scalić porcje w jeden strumień, musisz załadować wszystkie rekordy do pamięci." Nie, nie zrobiłbyś tego. Potrzebujesz tylko tyle pamięci, aby załadować kolejny ciąg z każdej części naraz, aby je porównać. Po wykonaniu porównania następny ciąg zajmie tę przestrzeń pamięci. – erickson
Nie rozumiem twojego algorytmu scalania. Załóżmy, że mamy plik zapisu 1 mil i tylko 5k rekordów może być załadowanych do pamięci. Z tego, co zrozumiałem, muszę najpierw podzielić plik na N elementów z 5K rekordami każdy. Następnie posortuj wszystkie rekordy w każdym pliku rekordów 5k i odpisz. Aby scalić dwa pliki rekordów 5k, musiałbym załadować pamięć o wielkości 10k w pamięci? Jeśli nie o to ci chodziło, możesz wyjaśnić, jak znaleźć duplikaty rekordów w pliku rekordu 1 mil z limitem pamięci ładowania tylko 5-krotnych rekordów. –
Odpowiedź ericksona jest prawdopodobnie oczekiwana przez kogoś, kto postawił to pytanie.
Można użyć każdej z maszyn N jak wiadro w hashtable:
- dla każdej struny, (słownie liczba ciąg i kolejno) obliczenie funkcji skrótu na nim h.
- wysłać wartości i i h do numeru maszyny n do przechowywania, gdzie n = h% N.
- z każdego komputera, pobrać listę wszystkich wartości skrótu h, dla których otrzymano więcej niż jeden indeks, łącznie z listą indeksów.
- sprawdź zestawy ciągów o równych wartościach skrótu, aby sprawdzić, czy są one rzeczywiście równe.
Szczerze mówiąc, za 10 miliardów łańcuchów można to prawdopodobnie zrobić na 1 komputerze. Hashtable może zajmować około 80-120 GB z 32-bitowym hash, w zależności od dokładnej implementacji hashtable. Jeśli szukasz wydajnego rozwiązania, musisz być nieco bardziej dokładny, co masz na myśli, mówiąc "maszyna", ponieważ zależy to od tego, ile jest w nim miejsca, a także od względnego kosztu komunikacji sieciowej.
- 1. Dopasowywanie ciągi znaków w dużym pliku tekstowym?
- 2. Znajdź i zamień w dużym pliku
- 3. Pandy: związkowe zduplikowane ciągi
- 4. Znajdź zduplikowane ciągi na liście i uczyń je unikalnymi.
- 5. Znajdź zduplikowane rekordy w MongoDB
- 6. Znajdź brakujące nawiasy klamrowe w dużym pliku PHP?
- 7. Znajdź zduplikowane obrazy różnych rozmiarów
- 8. Znajdź zduplikowane wiersze z PostgreSQL
- 9. Znajdź zduplikowane elementy z dplyr
- 10. Znajdź liczbę linii w ciągi
- 11. wstawianie napisów w dużym pliku
- 12. Znajdź wszystkie ciągi w plikach kodu Pythona
- 13. Edycja pojedynczej linii w dużym pliku tekstowym
- 14. Znajdź i zamień ciągi znaków w vim na wielu liniach
- 15. Dlaczego chciałbym znaleźć "Zduplikowane ciągi" za pomocą programu HPROF Viewer and Analyzer?
- 16. Znajdź i usunąć zduplikowane wiersze przez dwie kolumny
- 17. wybierz-pierwsze 1 na dużym pliku
- 18. javascript: znajdź ciągi znaków w dom i podkreśl go.
- 19. Usunąć zduplikowane linie z pliku tekstowego?
- 20. Wyszukaj i zamień ciąg znaków w bardzo dużym pliku.
- 21. Wyszukiwanie binarne na dużym pliku dyskowym w języku C - problemy
- 22. Znajdź najczęstszą linii w pliku w bash
- 23. Zduplikowane wpisy w ListView
- 24. Komenda lub skrypt Linuksa zliczające zduplikowane linie w pliku tekstowym?
- 25. W jaki sposób mogę usunąć zduplikowane linie z pliku?
- 26. Znajdź nazwę bieżącego pliku konfiguracyjnego
- 27. Znajdź ścieżkę pliku wykonywalnego w vim
- 28. znajdź i zamień ciąg znaków w pliku
- 29. python - znajdź wystąpienie słowa w pliku
- 30. Unix znajdź średni rozmiar pliku
Czy to zadanie domowe? To brzmi jak zadanie domowe. – SoapBox