2013-06-10 35 views
9

Cách nhanh nhất để lặp qua tất cả các tệp trong thư mục bằng NTFS và Windows 7 khi filecount trong thư mục lớn hơn 2.500.000 là gì? Tất cả các tệp đều bằng phẳng trong thư mục cấp cao nhất.Lặp lại một số lượng lớn các tệp trong một thư mục

Hiện nay tôi sử dụng

for root, subFolders, files in os.walk(rootdir): 
    for file in files: 
     f = os.path.join(root,file) 
     with open(f) as cf: 
      [...] 

nhưng nó là rất rất chậm. Quá trình này đã được chạy trong khoảng một giờ và vẫn chưa xử lý một tệp nhưng vẫn phát triển với khoảng 2kB Dung lượng bộ nhớ mỗi giây.

+1

Nó có phải là một tùy chọn để cơ cấu lại hệ thống tệp sao cho thay vì một thư mục có nhiều tệp, bạn có nhiều thư mục, mỗi thư mục chứa một số tệp? – thejh

+0

có, đó sẽ là một ý tưởng. nhưng nó cũng sẽ mất nhiều thời gian để lặp lại ở đây và di chuyển các tập tin? – reox

+1

1000000000 tệp trong một thư mục phẳng hoặc trong một cây thư mục? Trong trường hợp sau, cây sâu bao nhiêu? –

Trả lời

5

Theo mặc định đi bộ thư mục từ dưới lên trên. Nếu bạn có một cây sâu với nhiều lá, tôi đoán điều này có thể để lại các hình phạt biểu diễn - hoặc ít nhất là tăng thời gian "statup", vì walk phải đọc nhiều dữ liệu trước khi xử lý tệp đầu tiên.

Tất cả điều này là suy đoán, có bạn đã cố gắng để buộc một cuộc thám hiểm từ trên xuống:

for root, subFolders, files in os.walk(rootdir, topdown=True): 
    ... 

EDIT:

Như các tập tin dường như trong một thư mục bằng phẳng, có lẽ glob.iglob có thể để lại hiệu suất tốt hơn bằng cách trả về một trình lặp (trong khi các phương thức khác như os.walk, os.listdir hoặc glob.glob xây dựng trước tiên danh sách của tất cả các tệp). Bạn có thể thử một cái gì đó như thế:

import glob 

# ... 
for infile in glob.iglob(os.path.join(rootdir, '*.*')): 
    # ... 
+0

Tôi phát hiện ra rằng tất cả các chức năng này là xấu, cho đến khi hệ thống tập tin đã xây dựng tập tin chỉ mục của nó. sau khi cây b cho thư mục được tạo ra bởi các cửa sổ (được thực hiện khi bạn lần đầu tiên lặp lại trên cấu trúc) mọi thứ khởi động trong vài giây. – reox

+0

Rất thú vị. Tuy nhiên, một chút thất vọng liên quan đến câu trả lời 'glob.iglob'. Tôi không quen thuộc với Windows, vì vậy tôi không cần hiểu rõ. Làm thế nào bạn giải quyết vấn đề? Bởi _manually_ chỉ "thám hiểm" của bạn vào thư mục? Hoặc chỉ mục được xây dựng lại _automagically_ trong lần chạy đầu tiên của chương trình Python? –

+0

Có vẻ như các cửa sổ hơi lạ một chút vào thời điểm đó ... khi B-Tree không được xây dựng, bạn sẽ không nhận được một trình lặp hay thứ gì đó tương tự. Nếu có cây như vậy, bạn sẽ nhận được ngay lập tức trình lặp và có thể tiếp tục. nhưng bằng cách nào đó cây đã bị xóa sau khi tôi di chuyển xung quanh một số tập tin - đó là strage bởi vì như các tài liệu cho tôi biết, nó nên được xây dựng lại. có thể nó không được xây dựng lại nếu nó quá lớn ... – reox

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