2009-07-29 24 views
8

Tôi đang tìm kiếm một số lượng vừa phải (~ 500) thư mục cho một số lượng lớn (~ 200.000) tệp từ một ứng dụng .NET.DirectoryInfo.GetFiles chậm khi sử dụng SearchOption.AllDirectories

Tôi hy vọng sử dụng DirectoryInfo.GetFiles, chuyển qua SearchOption.AllDirectories. Tuy nhiên, cách tiếp cận này dường như chậm hơn rất nhiều so với việc viết mã của riêng tôi để lặp qua các thư mục và làm GetFiles chỉ cần chuyển vào một số searchPattern.

liên quan MSDN info:

  • GetFiles(String)
    Trả về một danh sách tập tin từ thư mục hiện hành phù hợp với các searchPattern nhất định.
  • GetFiles(String, SearchOption)
    Trả về danh sách tệp từ thư mục hiện tại khớp với mẫu tìm kiếm đã cho và sử dụng giá trị để xác định xem có tìm kiếm thư mục con không.

Có ai có kinh nghiệm tương tự về điều này không?

Trả lời

13

Hai chức năng này thực sự nổi tiếng về hiệu suất của chúng. Lý do là GetFiles đi toàn bộ cây thư mục và xây dựng một mảng các đối tượng FileInfo và chỉ sau đó trả về kết quả cho người gọi. Việc xây dựng mảng cho biết liên quan đến rất nhiều phân bổ bộ nhớ (tôi chắc chắn rằng chúng sử dụng List nội bộ, nhưng vẫn) vì số lượng mục nhập không thể được biết trước thời hạn.

Nếu bạn đang thực sự vào hiệu suất, bạn có thể P/Gọi vào FindFirstFile/FindNextFile/FindClose, trừu tượng chúng thành một FileInfo s một IEnumerable<FileInfo>yield tại một thời điểm.

+1

Câu trả lời hay và ví dụ tốt về sử dụng lợi nhuận. – RichardOD

1

Cách tiếp cận mà Anton đã đề cập sử dụng FirstFirstFile() và các phương pháp gốc có liên quan đã được triển khai từ .NET 4 qua DirectoryInfo.EnumerateFiles() vì vậy không cần P/Invoke cho việc này nữa!

Các vấn đề liên quan