2009-07-29 17 views
8

Szukam umiarkowanej liczby (~ 500) folderów dla dużej liczby (~ 200 000) plików z aplikacji .NET.DirectoryInfo.GetFiles spowalnia podczas korzystania z SearchOption.AllDirectories

Chciałem użyć DirectoryInfo.GetFiles, przekazując w SearchOption.AllDirectories. Jednak to podejście wydaje się być dużo wolniejsze niż napisanie własnego kodu do iterowania w katalogach i zrobienie GetFiles po prostu przekazanie w postaci searchPattern.

Podobne MSDN info:

  • GetFiles(String)
    Zwraca listę plików z bieżącego katalogu zgodne z podaną searchPattern.
  • GetFiles(String, SearchOption)
    Powoduje zwrócenie listy plików z bieżącego katalogu zgodnego z podanym parametrem searchPattern i użycie wartości do określenia, czy wyszukiwać podkatalogi.

Czy ktoś miał podobne do tego doświadczenie?

Odpowiedz

13

Te dwie funkcje są niesławne ze względu na ich wydajność. Powodem jest to, że GetFiles przechodzi przez całe drzewo katalogów i tworzy tablicę obiektów o rozmiarze FileInfo, a następnie zwraca wynik do wywołującego. Budowa wspomnianej macierzy wiąże się z dużą ilością przydziałów pamięci (jestem pewien, że używają one wewnętrznie, ale nadal), ponieważ liczba wpisów nie może być znana z wyprzedzeniem.

Jeśli jesteś naprawdę do wykonania, można P/Invoke do FindFirstFile/FindNextFile/FindClose, streszczenie je w FileInfo jedna na raz IEnumerable<FileInfo> i yield.

+1

Dobra odpowiedź i dobry przykład wykorzystania plonów. – RichardOD

1

Podejście Anton wymienione przy użyciu FirstFirstFile() i pokrewnych natywnych metod zostało zaimplementowane od .NET 4 przez DirectoryInfo.EnumerateFiles(), więc nie trzeba już dla tego P/Invoke!

Powiązane problemy