Wpis z mikrobloga

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śli
niejestwykluczony(Folder): // Tylko nazwa jest potrzebna
---- foldery.append(Folder)
-- Plik
--- jeśliniejestwykluczony(Folder):
---- Zbierz metadata tego pliku
---- jeśli Plik.len() > 100:
----- duże
pliki.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
  • 4
@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ć