Có thể đặt tất cả các tệp trong một thư mục, mặc dù đôi khi điều đó có thể trở nên hơi lớn. Nhiều hệ thống tập tin có một giới hạn . Bạn muốn đặt một kho lưu trữ git trên ổ đĩa được định dạng FAT32 trên thanh USB? Bạn chỉ có thể lưu trữ 65.535 tệp trong một thư mục. Điều này có nghĩa là cần phải chia nhỏ cấu trúc thư mục để việc điền vào một thư mục ít xảy ra.
Điều này thậm chí sẽ trở thành một vấn đề với các hệ thống tập tin khác và kho git lớn hơn. Một repo git tương đối nhỏ mà tôi đã đi chơi (khoảng 360MiB) và nó có 181.546 đối tượng cho các tệp 11k. Kéo repo Linux và bạn đã có 4.374.054 đối tượng. Nếu bạn đặt tất cả những thứ này trong một thư mục, sẽ không thể kiểm tra và sẽ bị sập (vì một số ý nghĩa của 'sự cố') hệ thống tệp.
Vì thế? Bạn chia nó ra theo byte. Cách tiếp cận tương tự được thực hiện với các ứng dụng như FireFox:
~/Li/Ca/Fi/Pr/7a/Cache $ ls
0/ 4/ 8/ C/ _CACHE_001_
1/ 5/ 9/ D/ _CACHE_002_
2/ 6/ A/ E/ _CACHE_003_
3/ 7/ B/ F/ _CACHE_MAP_
Ngoài ra, nó cũng đi đến một câu hỏi về hiệu suất. Xem xét hiệu suất NTFS với nhiều tên tệp dài :
Windows NT mất nhiều thời gian để thực hiện các thao tác thư mục trên các ổ đĩa được định dạng của hệ thống tệp Windows NT (NTFS) có chứa một số lượng lớn tệp có tên tệp dài (tên không tuân theo quy ước 8.3) trong một thư mục.
Khi NTFS liệt kê các tệp trong một thư mục, nó phải tìm kiếm 8.3 tên được liên kết với các tên tệp dài. Vì một thư mục NTFS được duy trì ở trạng thái được sắp xếp, nên các tên tệp dài và tên 8.3 tương ứng thường không nằm cạnh nhau trong danh sách thư mục. Vì vậy, NTFS sử dụng tìm kiếm tuyến tính của thư mục cho mọi tệp hiện tại. Do đó, lượng thời gian cần thiết để thực hiện danh sách thư mục tăng theo bình phương số lượng tệp trong thư mục. Đối với số lượng nhỏ tệp (dưới vài trăm), thời gian trễ là không đáng kể. Nhưng khi số lượng tệp trong một thư mục tăng lên đến vài nghìn, thời gian cần thiết để thực hiện một danh sách có thể tăng lên đến vài phút, giờ hoặc thậm chí là vài ngày. Vấn đề sẽ trầm trọng hơn nếu tên tệp dài rất giống nhau - chỉ khác nhau ở một vài ký tự cuối cùng.
Với các tệp được đặt tên theo tổng kiểm tra SHA1, đây có thể là một công thức cho hiệu suất thảm họa và kinh tởm.
Mặc dù ở trên là từ một ghi chú công nghệ từ Windows NT 3.5 (và NTFS 1.2 - thường được sử dụng từ năm 1995 đến đầu những năm 2000), điều này cũng có thể được nhìn thấy trong những thứ như EXT3 với việc triển khai hệ thống tệp được liệt kê liên kết yêu cầu tra cứu O (n) . Và ngay cả với sự thay đổi cây B đó:
Mặc dù thuật toán HTree cải thiện đáng kể thời gian tra cứu, nó có thể gây ra một số hồi quy hiệu suất cho khối lượng công việc đã sử dụng readdir () để thực hiện một số thao tác của tất cả các tệp trong một thư mục lớn.
...
Một giải pháp tiềm năng để giảm thiểu vấn đề hiệu năng này, được đề xuất bởi Daniel Phillips và Andreas Dilger, nhưng chưa được triển khai, liên quan đến hạt nhân chọn các nút inode miễn phí có số inode đáp ứng một thuộc tính nhóm băm theo tên tệp băm. Daniel và Andreas đề nghị phân bổ inode từ một loạt các nút dựa trên kích thước của thư mục, sau đó chọn một inode miễn phí từ phạm vi đó dựa trên hàm băm tên tệp. Về lý thuyết, điều này sẽ làm giảm số lượng đập mà kết quả khi truy cập vào các nút được tham chiếu trong thư mục theo thứ tự readdir. Trong đó không rõ ràng rằng chiến lược này sẽ dẫn đến tăng tốc, tuy nhiên; trong thực tế, nó có thể làm tăng tổng số khối inode có thể phải được tham chiếu, và do đó làm cho hiệu suất của khối lượng công việc readdir () + stat () trở nên tồi tệ hơn. Thông suốt,
Ngẫu nhiên, bit này về cách cải thiện hiệu suất là từ năm 2005, cùng năm git đã được phát hành.
Như đã thấy với Firefox và nhiều ứng dụng khác có nhiều tệp được lưu trong bộ nhớ cache, thiết kế chia tách bộ đệm theo byte. Nó có chi phí hiệu năng không đáng kể và khi được sử dụng đa nền tảng với các hệ thống có thể là một chút về phía cũ, rất có thể là sự khác biệt giữa chương trình làm việc hay không.