Pertanyaan DirectoryInfo.GetFiles lambat ketika menggunakan SearchOption.AllDirectories


Saya mencari nomor moderat (~ 500) folder untuk sejumlah besar (~ 200.000) file dari aplikasi .NET.

Saya berharap untuk menggunakannya DirectoryInfo.GetFiles, lewat SearchOption.AllDirectories. Namun pendekatan ini tampaknya jauh lebih lambat daripada menulis kode saya sendiri untuk melakukan iterasi melalui direktori dan lakukan GetFiles hanya lewat dalam searchPattern.

Terkait Info MSDN:

  • GetFiles(String)
    Mengembalikan daftar file dari direktori saat ini yang cocok dengan searchPattern yang diberikan.
  • GetFiles(String, SearchOption)
    Mengembalikan daftar file dari direktori saat ini yang cocok dengan searchPattern yang diberikan dan menggunakan nilai untuk menentukan apakah akan mencari subdirektori.

Adakah yang punya pengalaman serupa dengan ini?


8
2017-07-29 11:55


asal


Jawaban:


Kedua fungsi ini sebenarnya terkenal karena kinerjanya. Alasannya adalah itu GetFiles berjalan seluruh pohon direktori dan membangun sebuah array FileInfo objek, dan hanya kemudian mengembalikan hasilnya ke pemanggil. Konstruksi array tersebut melibatkan banyak alokasi memori (saya yakin mereka menggunakannya List secara internal, tetapi masih) karena jumlah entri tidak dapat diketahui sebelumnya.

Jika Anda benar-benar dalam kinerja, Anda dapat P / Invoke ke FindFirstFile/FindNextFile/FindClose, abstrak mereka menjadi IEnumerable<FileInfo> dan yield  FileInfosatu per satu.


13
2017-07-29 12:02



Pendekatan yang disebutkan Anton menggunakan FirstFirstFile() dan metode asli terkait telah diimplementasikan pada .NET 4 via DirectoryInfo.EnumerateFiles() jadi tidak perlu lagi P / Invoke untuk ini!


1
2017-11-01 05:59