2009-03-05 82 views
6

Tôi đang trong quá trình triển khai bộ nhớ đệm cho dự án của mình. Sau khi xem cấu trúc thư mục bộ nhớ cache, tôi đã thấy nhiều ví dụ như:Cấu trúc thư mục bộ nhớ cache

cache 
cache/a 
cache/a/a/ 
cache/a/... 
cache/a/z 
cache/... 
cache/z 
... 

Bạn hiểu ý tưởng. Một ví dụ khác để lưu trữ các file, giả sử tập tin của chúng tôi được đặt tên IMG_PARTY.JPG, một cách phổ biến là đặt nó trong một thư mục có tên:

files/i/m/IMG_PARTY.JPG 

Vài suy nghĩ đến tâm trí, nhưng tôi muốn biết lý do thực sự cho điều này.

  • Tìm kiếm các tệp hệ thống tìm kiếm tệp nhanh hơn khi có ít tệp hơn trong thư mục. Cấu trúc này phân tán các tập tin mỏng.

  • Để không mess up * Tiện ích nix như rm, trong đó có một số hữu hạn các lập luận và xóa số lượng lớn các tập tin cùng một lúc có xu hướng được hacky (cần phải vượt qua nó mặc dù find, vv)

Lý do thực sự là gì? Cấu trúc thư mục cache "tốt" là gì và tại sao?

Trả lời

3

Mỗi khi tôi đã thực hiện nó, nó đã được để tránh tìm kiếm tuyến tính chậm trong hệ thống tập tin. May mắn thay, ít nhất là trên Linux, điều này đang trở thành một điều của quá khứ. Tuy nhiên, ngay cả ngày nay, với thư mục dựa trên b-tree, một thư mục rất lớn sẽ khó giải quyết, vì nó sẽ mất mãi mãi và một ngày để có được danh sách tất cả các tệp, không bao giờ tìm được quyền tập tin.

+0

Ah, nghĩ rằng nó có liên quan đến nó. Rất muốn biết FS's nào vẫn sử dụng tìm kiếm tuyến tính. Tôi sẽ đợi thêm câu trả lời trước khi chọn một câu trả lời như đã được chấp nhận, cảm ơn! – Karolis

+1

Trên Linux, ext2 và ext3 sử dụng tìm kiếm tuyến tính, trừ khi tùy chọn dir_index được bật cho hệ thống tệp (nó được mặc định trong một thời gian). Nói chung, các hệ thống tập tin cũ sử dụng tuyến tính, các hệ thống mới sử dụng cây. –

2

Chỉ cần sử dụng ngày. Vì bạn sẽ xóa theo ngày. :)

+0

Kinh nghiệm của tôi là điều này có thể tạo ra các vấn đề về hiệu suất, nếu bạn cần xóa bộ nhớ cache theo cách thủ công - vì tất cả các tệp được tạo ngay sau (bằng cách làm mới bộ nhớ cache hoặc khi công chúng truy cập một số trang phổ biến) sẽ có dấu thời gian gần giống nhau. –

2

Nếu bạn làm ls -l, tất cả các tệp cần phải là stat() để nhận chi tiết, điều này làm tăng đáng kể thời gian niêm yết - điều này xảy ra cho dù FS sử dụng cấu trúc băm hoặc tuyến tính.

Vì vậy, ngay cả khi FS có khả năng đối phó với kích thước thư mục vô cùng lớn, có những lý do chính đáng không có cấu trúc phẳng lớn (Họ cũng là một con lợn để sao lưu)

Tôi đã benchmarked GFS2 (nhóm) với 32.000 tệp trong thư mục hoặc sắp xếp theo cấu trúc cây - danh sách đệ quy nhanh hơn 300 lần so với danh sách khi chúng được cấu trúc bằng phẳng (có thể mất tối đa 10 phút để có danh sách thư mục)

EXT4 cho thấy tỷ lệ tương tự nhưng khi kết thúc chỉ là một vài giây hầu hết mọi người sẽ không nhận thấy.

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