Hej, Potrzebuję zebrać listę plików ze wskazanej przez użytkownika lokalizacji np. /home/user(może ich też być wiele). Póki co mam wyszukiwanie takich pików zrobione jednowątkowo dlatego jest to dość powolne na 4 rdzeniowym procesorze i SSD.
W skrócie pseudo algorytm np. do wyszukiwania największych plików mam taki:
let foldery = Vec let dużepliki = Hashmap> // Puste na początku
while !folder.empty(): - Otwórz pierwszy folder i wyrzuć go z wektora - Wyświetl wszystkie jego "dzieci" - Dla każdego dziecka(Folder albo plik, reszta jest ignorowana) -- Folder --- jeśliniejestwykluczony(Folder): // Tylko nazwa jest potrzebna ---- foldery.append(Folder) -- Plik --- jeśliniejestwykluczony(Folder): ---- Zbierz metadata tego pliku ---- jeśli Plik.len() > 100: ----- dużepliki.append(Pliki)
Myślałem nad Rayonem, ale nie wiem w jaki sposób obsłużyć zmienną folder, z której zarówno są zabierane elementy jak i dodawane. W jaki sposób najoptymalniej to zrobić?
@Saly: Z jednej strony wygląda na to, że mogłoby mi to pomóc, ale póki co mam problem z 2 rzeczami: - Nie wiem czemu ale pokazuje że "./" jest obecny w danym folderze i nie wiem jak to wyrzucić z wyników. - Nie wiem jak działa wielowątkowość(build_parallel) - czy bez względu na ilość danych wejściowych jest używanych kilka wątków, czy dla każdego wejścia jeden wątek(wolałbym to pierwsze)
@qarmin: Możesz wrzucić foldery w muteksa i zobaczyć na perf gdzie program spędza najwięcej czasu, czy jest sens w ogóle optymalizować etc. Jeśli będziesz miał high contention na muteksie, to możesz zrobić coś a la work stealing. Każdy wątek ma własny mutex + foldery i wykonuje ten algorytm. Jeśli jednemu wątkowi zabraknie pracy, to może ukraść kilka folderów z innego wątku i kontynuować. IIRC crossbeam-deque działa chyba w podobny sposób
@qarmin: imho robienie skanera na kolejkach się nawet sprawdza, i ładnie skaluje. Przykładowo, wrzucasz X workerami nieprzeskanowane rzeczy (czy to podkatalogi czy brakujące metadane) do kolejki, a Y workerami czytasz sobie z kolejki co tam trzeba zrobić
Potrzebuję zebrać listę plików ze wskazanej przez użytkownika lokalizacji np.
/home/user
(może ich też być wiele).Póki co mam wyszukiwanie takich pików zrobione jednowątkowo dlatego jest to dość powolne na 4 rdzeniowym procesorze i SSD.
W skrócie pseudo algorytm np. do wyszukiwania największych plików mam taki:
let foldery = Vec
let dużepliki = Hashmap> // Puste na początku
while !folder.empty():
- Otwórz pierwszy folder i wyrzuć go z wektora
- Wyświetl wszystkie jego "dzieci"
- Dla każdego dziecka(Folder albo plik, reszta jest ignorowana)
-- Folder
--- jeśliniejestwykluczony(Folder): // Tylko nazwa jest potrzebna
---- foldery.append(Folder)
-- Plik
--- jeśliniejestwykluczony(Folder):
---- Zbierz metadata tego pliku
---- jeśli Plik.len() > 100:
----- dużepliki.append(Pliki)
Myślałem nad Rayonem, ale nie wiem w jaki sposób obsłużyć zmienną folder, z której zarówno są zabierane elementy jak i dodawane.
W jaki sposób najoptymalniej to zrobić?
#rustlang #programowanie #algorytmy
- Nie wiem czemu ale pokazuje że "./" jest obecny w danym folderze i nie wiem jak to wyrzucić z wyników.
- Nie wiem jak działa wielowątkowość(build_parallel) - czy bez względu na ilość danych wejściowych jest używanych kilka wątków, czy dla każdego wejścia jeden wątek(wolałbym to pierwsze)
Jeśli będziesz miał high contention na muteksie, to możesz zrobić coś a la work stealing. Każdy wątek ma własny mutex + foldery i wykonuje ten algorytm. Jeśli jednemu wątkowi zabraknie pracy, to może ukraść kilka folderów z innego wątku i kontynuować. IIRC crossbeam-deque działa chyba w podobny sposób