Tôi có thể đặt bao nhiêu tệp trong một thư mục?


561

Có vấn đề bao nhiêu tập tin tôi giữ trong một thư mục? Nếu vậy, có bao nhiêu tệp trong một thư mục quá nhiều và tác động của việc có quá nhiều tệp là gì? (Đây là trên máy chủ Linux.)

Bối cảnh: Tôi có một trang web album ảnh và mọi hình ảnh được tải lên được đổi tên thành id 8 chữ số (giả sử a58f375c.jpg). Điều này là để tránh xung đột tên tệp (ví dụ: nếu nhiều tệp "IMG0001.JPG" được tải lên). Tên tệp gốc và bất kỳ siêu dữ liệu hữu ích nào được lưu trữ trong cơ sở dữ liệu. Ngay bây giờ, tôi có khoảng 1500 tệp trong thư mục hình ảnh. Điều này làm cho việc liệt kê các tệp trong thư mục (thông qua FTP hoặc máy khách SSH) mất vài giây. Nhưng tôi không thể thấy rằng nó có bất kỳ ảnh hưởng nào khác hơn thế. Đặc biệt, dường như không có bất kỳ tác động nào đến việc một tệp hình ảnh được phục vụ cho người dùng nhanh như thế nào.

Tôi đã nghĩ về việc giảm số lượng hình ảnh bằng cách tạo 16 thư mục con: 0-9 và af. Sau đó, tôi sẽ di chuyển hình ảnh vào các thư mục con dựa trên chữ số hex đầu tiên của tên tệp là gì. Nhưng tôi không chắc chắn rằng có bất kỳ lý do nào để làm như vậy ngoại trừ danh sách thư mục không thường xuyên thông qua FTP / SSH.

Câu trả lời:


736

FAT32 :

  • Số lượng tệp tối đa: 268.173.300
  • Số lượng tệp tối đa cho mỗi thư mục: 2 16  - 1 (65,535)
  • Kích thước tệp tối đa: 2 GiB - 1 không có LFS , 4 GiB - 1 với

NTFS :

  • Số lượng tệp tối đa: 2 32  - 1 (4.294.967.295)
  • Kích thước tệp tối đa
    • Thực hiện: 2 44  - 2 6 byte (16 TiB - 64 KiB)
    • Lý thuyết: 2 64  - 2 6 byte (16 EiB - 64 KiB)
  • Kích thước âm lượng tối đa
    • Thực hiện: 2  cụm 32 - 1 (256 TiB - 64 KiB)
    • Lý thuyết: 2  cụm 64 - 1 (1 YiB - 64 KiB)

ext2 :

  • Số lượng tệp tối đa: 10 18
  • Số lượng tệp tối đa cho mỗi thư mục: ~ 1.3 × 10 20 (vấn đề hiệu suất vượt quá 10.000)
  • Kích thước tệp tối đa
    • 16 GiB (kích thước khối 1 KiB)
    • 256 GiB (kích thước khối 2 KiB)
    • 2 TiB (kích thước khối 4 KiB)
    • 2 TiB (kích thước khối 8 KiB)
  • Kích thước âm lượng tối đa
    • 4 TiB (kích thước khối 1 KiB)
    • 8 TiB (kích thước khối 2 KiB)
    • 16 TiB (kích thước khối 4 KiB)
    • 32 TiB (kích thước khối 8 KiB)

máy lẻ 3 :

  • Số lượng tệp tối đa: tối thiểu (volumeSize / 2 13 , numberOfBlocks)
  • Kích thước tệp tối đa: giống như ext2
  • Kích thước âm lượng tối đa: giống như ext2

máy lẻ 4 :

  • Số lượng tệp tối đa: 2 32  - 1 (4.294.967.295)
  • Số lượng tệp tối đa cho mỗi thư mục: không giới hạn
  • Kích thước tệp tối đa: 2 44  - 1 byte (16 TiB - 1)
  • Kích thước âm lượng tối đa: 2 48  - 1 byte (256 TiB - 1)

24
Tôi giả sử đây là số lượng tệp tối đa cho toàn bộ phân vùng, không phải là một thư mục. Do đó, thông tin này không quá hữu ích đối với vấn đề này, vì sẽ có số lượng tệp bằng nhau bất kể phương thức nào (trừ khi bạn tính các thư mục là tệp).
strager

19
Vì chúng tôi đang ở trong năm 2012, tôi nghĩ đã đến lúc phải làm rõ rằng ext4 không có bất kỳ giới hạn nào liên quan đến số lượng thư mục con. Kích thước tập tin tối đa cũng tăng lên 16 TB. Hơn nữa, kích thước tổng thể của hệ thống tập tin có thể lên tới 1 EB = 1.048.576 TB.
devsnd

7
Rõ ràng, ext3 cũng có giới hạn 60.000 tệp (hoặc thư mục hoặc liên kết) trên mỗi thư mục. Tôi phát hiện ra một cách khó khăn về điều này.
chồng

8
Câu trả lời cũ, tôi biết cách nhưng khi bạn viết EXT4 - Số lượng tệp tối đa: 2³² - 1 (4.294.967.295)Số lượng tệp tối đa cho mỗi thư mục: không giới hạn bạn thực sự làm tôi bối rối vì 2³² - 1! Tôi đoán tôi cần một ly cà phê bây giờ. ;) Tuy nhiên +1
e-sushi

11
giới hạn hệ thống tập tin cứng không trả lời câu hỏi " Có vấn đề bao nhiêu tập tin tôi giữ trong một thư mục không? "
Etki

191

Tôi đã có hơn 8 triệu tệp trong một thư mục ext3. libc readdir()được sử dụng bởi find, lsvà hầu hết các phương pháp khác được thảo luận trong chủ đề này vào danh sách các thư mục lớn.

Lý do lsfindchậm trong trường hợp này là readdir()chỉ đọc 32K mục nhập thư mục tại một thời điểm, vì vậy trên các đĩa chậm, nó sẽ yêu cầu nhiều lần đọc để liệt kê một thư mục. Có một giải pháp cho vấn đề tốc độ này. Tôi đã viết một bài viết khá chi tiết về nó tại: http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not-with- ls /

Chìa khóa mang đi là: sử dụng getdents()trực tiếp - http://www.kernel.org/doc/man-pages/online/pages/man2/getdents.2.html chứ không phải bất cứ thứ gì dựa trên libc readdir()để bạn có thể chỉ định bộ đệm kích thước khi đọc các mục thư mục từ đĩa.


6
Thú vị đọc! Tôi có thể hỏi trong tình huống nào bạn có 8 triệu tệp trong một thư mục không? haha
Aᴄʜᴇʀᴏɴғᴀɪʟ

Tôi đã có cùng. Tôi đã di chuyển cột blob của bảng, mỗi cột blob tôi đã xuất dưới dạng tệp. Đó là khoảng 8 triệu tệp :)
Spike

65

Tôi có một thư mục chứa 88.914 tệp trong đó. Giống như bản thân bạn, điều này được sử dụng để lưu trữ hình thu nhỏ và trên máy chủ Linux.

Có các tệp được liệt kê qua FTP hoặc chức năng php là chậm, nhưng cũng có một hiệu suất nhấn vào việc hiển thị tệp. ví dụ: www.website.com/thumbdir/gh3hg4h2b4h234b3h2.jpg có thời gian chờ 200-400 ms. Để so sánh trên một trang web khác tôi có khoảng 100 tệp trong một thư mục, hình ảnh được hiển thị chỉ sau ~ 40ms chờ đợi.

Tôi đã đưa ra câu trả lời này vì hầu hết mọi người vừa viết về cách các chức năng tìm kiếm thư mục sẽ hoạt động, mà bạn sẽ không sử dụng trên thư mục ngón tay cái - chỉ hiển thị tĩnh các tệp, nhưng sẽ quan tâm đến hiệu suất của các tệp thực sự có thể được sử dụng .


6
Đây là câu trả lời hữu ích duy nhất. Chúng tôi đã thực hiện những kinh nghiệm tương tự. Giới hạn của chúng tôi là 1.000 tệp để giảm các vấn đề với sao lưu (quá nhiều thư mục cũng bị chậm).
mgutt

1
Nó có thể hữu ích để gắn một ổ đĩa với noatime cũng như: howtoforge.com/... và đọc cái này, quá: serverfault.com/questions/354017/...
mgutt

2
Bạn đang sử dụng hệ thống tập tin nào khi nó chạy chậm lại? XFS, ví dụ, có thể dễ dàng xử lý 100.000 tệp trong một thư mục mà không có bất kỳ sự chậm trễ đáng chú ý nào.
Ethan

1
Mâu thuẫn với ý kiến ​​của hầu hết những người khác, tôi muốn xác nhận câu trả lời này. Chúng tôi có hàng trăm ngàn hình ảnh trong trang web mạng xã hội của chúng tôi. Để cải thiện hiệu suất, chúng tôi buộc phải có 100 (hoặc 1000 cho một số tệp) thư mục con và phân phối các tệp vào chúng (ext3 trên linux + Apache cho chúng tôi).
wmac

57

Nó phụ thuộc một chút vào hệ thống tệp cụ thể được sử dụng trên máy chủ Linux. Ngày nay, mặc định là ext3 với dir_index, giúp tìm kiếm các thư mục lớn rất nhanh.

Vì vậy, tốc độ không phải là một vấn đề, ngoài vấn đề bạn đã lưu ý, đó là danh sách sẽ mất nhiều thời gian hơn.

Có giới hạn tổng số tệp trong một thư mục. Tôi dường như nhớ nó chắc chắn làm việc lên đến 32000 tập tin.


4
Gnome và KDE tải các thư mục lớn với tốc độ ốc sên, windows sẽ lưu trữ thư mục sao cho hợp lý. Tôi yêu Linux, nhưng kde và gnome được viết kém.
rook

1
Và ext4 dường như có tương đương với dir_index theo mặc định.
Hợp đồng của giáo sư Falken vi phạm

22
Có giới hạn khoảng 32K thư mục con trong một thư mục trong ext3, nhưng OP đang nói về các tệp hình ảnh. Không có giới hạn (thực tế?) Đối với các tệp trong hệ thống tệp ext3 có bật Chỉ mục Dir.
Peter N Lewis

1
Câu trả lời này đã lỗi thời, ngày nay mặc định là ext4 .
Boris

1
"Không có giới hạn (thực tế?) Đối với các tệp trong hệ thống tệp ext3 có bật Chỉ mục Dir" - Tôi vừa hết dung lượng tệp trong một thư mục trên hệ thống tệp ext4 4TB, dir_indexđã bật. Tôi có khoảng 17 triệu tập tin trong thư mục. Câu trả lời là bật large_dirvới Tune2fs.
lunixbochs

49

Hãy nhớ rằng trên Linux nếu bạn có một thư mục chứa quá nhiều tệp, trình bao có thể không thể mở rộng các ký tự đại diện. Tôi gặp vấn đề này với một album ảnh được lưu trữ trên Linux. Nó lưu trữ tất cả các hình ảnh thay đổi kích thước trong một thư mục duy nhất. Trong khi hệ thống tệp có thể xử lý nhiều tệp, trình bao không thể. Thí dụ:

-shell-3.00$ ls A*
-shell: /bin/ls: Argument list too long

hoặc là

-shell-3.00$ chmod 644 *jpg
-shell: /bin/chmod: Argument list too long

33
@Steve, sử dụng find (1) và / hoặc xargs (1) cho những trường hợp này. Vì lý do tương tự, nên sử dụng các công cụ như vậy trong các tập lệnh thay vì mở rộng dòng lệnh.
Dave C

3
@Steve bạn có thấy hiệu suất giảm khi số lượng tệp trong thư mục tăng không? Hay là không có quan hệ?
Pacerier

6
Đây là một điểm tốt nhưng với nitpick, lý do được đưa ra là sai. Các Đối số danh sách quá dài là một giới hạn không của vỏ, nhưng trong những hệ thống execthực hiện. Shell thường có thể mở rộng ký tự đại diện tốt - đó là cuộc gọi execvới nhiều đối số trả về lỗi.
jw013

Tôi đã có cùng một lỗi đêm qua (Fedora 15) với "rm" (somefiles *) với khoảng ~ 400.000 tệp trong một thư mục. Tôi đã có thể cắt các tệp cũ hơn bằng "tìm" đến mức tôi có thể "rm" bằng ký tự đại diện.
PJ Brunet

10.000.000 tệp vào một thư mục trên etx4 hoạt động tốt. Không có nhiều hiệu suất đạt được khi truy cập. Nhưng khá chậm với ký tự đại diện. Hãy cẩn thận khi sử dụng các chương trình shell thích sắp xếp tên tệp! :)
Simon Rigét

25

Tôi đang làm việc với một vấn đề tương tự ngay bây giờ. Chúng tôi có cấu trúc thư mục phân cấp và sử dụng id hình ảnh làm tên tệp. Ví dụ: một hình ảnh id=1234567được đặt trong

..../45/67/1234567_<...>.jpg

sử dụng 4 chữ số cuối để xác định nơi tập tin đi.

Với vài nghìn hình ảnh, bạn có thể sử dụng hệ thống phân cấp một cấp. Sysadmin của chúng tôi đề xuất không quá vài nghìn tệp trong bất kỳ thư mục đã cho (ext3) nào về hiệu quả / sao lưu / bất kỳ lý do nào khác mà anh ấy có trong đầu.


1
Đây là một giải pháp khá hay. Mỗi cấp độ thư mục của bạn xuống tệp sẽ có tối đa 100 mục trong đó nếu bạn dính vào bảng phân tích 2 chữ số và thư mục dưới cùng nhất sẽ chỉ có 1 tệp.
RobKohr


21

Để biết giá trị của nó, tôi chỉ cần tạo một thư mục trên một ext4hệ thống tệp có 1.000.000 tệp trong đó, sau đó truy cập ngẫu nhiên các tệp đó qua máy chủ web. Tôi không nhận thấy bất kỳ phí bảo hiểm nào khi truy cập vào những người trên (nói) chỉ có 10 tệp ở đó.

Điều này hoàn toàn khác với kinh nghiệm của tôi khi làm điều này trong ntfsmột vài năm trước.


Những loại tập tin? Tôi đang ở ext4 và phải nhập 80000 hình ảnh trong một thư mục dưới wordpress và muốn biết liệu nó có ổn không
Yvon Huynh

1
@YvonHuynh: Loại tệp hoàn toàn không liên quan. Chi phí trong thư mục liệt kê / theo dõi tệp là như nhau bất kể.
TJ Crowder

14

Vấn đề lớn nhất mà tôi gặp phải là trên hệ thống 32 bit. Khi bạn vượt qua một số nhất định, các công cụ như 'ls' sẽ ngừng hoạt động.

Cố gắng làm bất cứ điều gì với thư mục đó một khi bạn vượt qua rào cản đó trở thành một vấn đề lớn.


9

Tôi đã có cùng một vấn đề. Cố gắng lưu trữ hàng triệu tệp trong máy chủ Ubuntu trong ext4. Đã kết thúc chạy điểm chuẩn của riêng tôi. Phát hiện ra rằng thư mục phẳng thực hiện cách tốt hơn trong khi sử dụng đơn giản hơn:

điểm chuẩn

Đã viết một bài báo .


Liên kết đến một giải pháp được hoan nghênh, nhưng vui lòng đảm bảo câu trả lời của bạn hữu ích mà không cần đến nó: thêm ngữ cảnh xung quanh liên kết để người dùng của bạn sẽ có ý tưởng về nó là gì và tại sao lại có, sau đó trích dẫn phần có liên quan nhất của trang bạn ' liên kết lại trong trường hợp trang đích không có sẵn. Câu trả lời ít hơn một liên kết có thể bị xóa.
Samuel Liew

1
Hấp dẫn. Chúng tôi thấy rằng sau 10.000 tập tin, hiệu suất đã giảm rất nhanh đến mức không thể sử dụng được. Chúng tôi đã giải quyết bằng cách chia các tệp thành các thư mục con khoảng 100 ở mỗi cấp để đạt được hiệu suất tối ưu. Tôi đoán đạo đức của câu chuyện là luôn luôn chuẩn hóa nó cho chính mình trên các hệ thống của riêng bạn với các yêu cầu của riêng bạn.
Joshua Pinter

7

Nếu thời gian liên quan đến việc thực hiện một lược đồ phân vùng thư mục là tối thiểu, tôi sẽ ủng hộ nó. Lần đầu tiên bạn phải gỡ lỗi một vấn đề liên quan đến thao tác thư mục 10000 tệp thông qua bảng điều khiển bạn sẽ hiểu.

Ví dụ, F-Spot lưu trữ các tệp ảnh dưới dạng YYYY \ MM \ DD \ filename.ext, có nghĩa là thư mục lớn nhất tôi phải xử lý trong khi thao tác thủ công bộ sưu tập ảnh ~ 20000 của tôi là khoảng 800 tệp. Điều này cũng làm cho các tệp dễ dàng duyệt hơn từ ứng dụng của bên thứ ba. Đừng bao giờ cho rằng phần mềm của bạn là thứ duy nhất sẽ truy cập vào tệp của phần mềm của bạn.


6
Tôi quảng cáo chống phân vùng theo ngày vì nhập hàng loạt có thể phân cụm các tệp vào một ngày nhất định.
tối đa

Một điểm tốt. Bạn chắc chắn nên xem xét các trường hợp sử dụng của mình trước khi chọn một sơ đồ phân vùng. Tôi tình cờ nhập ảnh trong nhiều ngày trong một bản phân phối tương đối rộng, VÀ khi tôi muốn thao tác với các bức ảnh ngoài ngày F-Spot là cách dễ nhất để tìm thấy chúng, vì vậy đó là một chiến thắng kép đối với tôi.
Sparr

7

Nó hoàn toàn phụ thuộc vào hệ thống tập tin. Nhiều hệ thống tệp hiện đại sử dụng cấu trúc dữ liệu hợp lý để lưu trữ nội dung của các thư mục, nhưng các hệ thống tệp cũ hơn thường chỉ thêm các mục vào danh sách, do đó, việc truy xuất tệp là thao tác O (n).

Ngay cả khi hệ thống tập tin thực hiện đúng, các chương trình liệt kê nội dung thư mục sẽ bị rối và thực hiện sắp xếp O (n ^ 2), vì vậy để đảm bảo an toàn, tôi luôn giới hạn số lượng tệp trên mỗi thư mục không quá 500.


7

Nó thực sự phụ thuộc vào hệ thống tập tin được sử dụng, và một số cờ.

Ví dụ: ext3 có thể có nhiều ngàn tệp; nhưng sau một vài ngàn, nó đã rất chậm. Chủ yếu là khi liệt kê một thư mục, nhưng cũng có thể khi mở một tập tin duy nhất. Một vài năm trước, nó đã đạt được tùy chọn 'htree', giúp rút ngắn đáng kể thời gian cần thiết để có một nút được cung cấp tên tệp.

Cá nhân, tôi sử dụng các thư mục con để giữ hầu hết các cấp dưới một nghìn mục. Trong trường hợp của bạn, tôi sẽ tạo 256 thư mục, với hai chữ số hex cuối cùng của ID. Sử dụng chữ số cuối cùng và không phải chữ số đầu tiên, để bạn có được tải cân bằng.


6
Nếu tên tệp là hoàn toàn ngẫu nhiên, việc sử dụng chữ số nào sẽ không thành vấn đề.
strager

Thật vậy, những tên tập tin này được tạo ngẫu nhiên.
Kip

2
Hoặc sử dụng N byte đầu tiên của bản tóm tắt SHA-1 của tên tệp.
gawi

6

Trên thực tế, ext3 có giới hạn kích thước thư mục và chúng phụ thuộc vào kích thước khối của hệ thống tập tin. Không có "số lượng tối đa" của mỗi thư mục, nhưng "số lượng khối tối đa" trên mỗi thư mục được sử dụng để lưu trữ các mục nhập tệp ". Cụ thể, kích thước của thư mục tự nó không thể phát triển vượt quá cây b có chiều cao 3 và sự xuất hiện của cây phụ thuộc vào kích thước khối. Xem liên kết này để biết một số chi tiết.

https://www.mail-archive.com/cwelug@googlegroups.com/msg01944.html

Gần đây tôi đã bị cắn bởi một hệ thống tập tin được định dạng với các khối 2K, điều này không thể giải thích được là các thông điệp kernel đầy thư mục warning: ext3_dx_add_entry: Directory index full!khi tôi sao chép từ một hệ thống tập tin ext3 khác. Trong trường hợp của tôi, một thư mục chỉ có 480.000 tệp không thể được sao chép đến đích.


5

Câu hỏi đặt ra là bạn sẽ làm gì với các tập tin.

Trong Windows, bất kỳ thư mục nào có hơn 2k tệp có xu hướng mở chậm đối với tôi trong Explorer. Nếu chúng là tất cả các tệp hình ảnh, hơn 1k có xu hướng mở rất chậm trong chế độ xem hình thu nhỏ.

Tại một thời điểm, giới hạn áp đặt hệ thống là 32.767. Bây giờ nó cao hơn, nhưng thậm chí đó là cách quá nhiều tệp để xử lý cùng một lúc trong hầu hết các trường hợp.


5

Điều mà hầu hết các câu trả lời ở trên không thể hiện là không có câu trả lời "One Size Fit All" cho câu hỏi ban đầu.

Trong môi trường ngày nay, chúng ta có một tập đoàn lớn gồm phần cứng và phần mềm khác nhau - một số là 32 bit, một số là 64 bit, một số là tiên tiến và một số là thử và đúng - đáng tin cậy và không bao giờ thay đổi. Thêm vào đó là một loạt các phần cứng cũ hơn và mới hơn, các hệ điều hành cũ hơn và mới hơn, các nhà cung cấp khác nhau (Windows, Unix, Apple, v.v.) và vô số các tiện ích và máy chủ đi cùng. Khi phần cứng đã được cải thiện và phần mềm được chuyển đổi thành khả năng tương thích 64 bit, chắc chắn đã có sự chậm trễ đáng kể trong việc đưa tất cả các phần của thế giới rất rộng lớn và phức tạp này chơi độc đáo với tốc độ thay đổi nhanh chóng.

IMHO không có cách nào để khắc phục vấn đề. Giải pháp là nghiên cứu các khả năng và sau đó bằng cách thử và tìm lỗi những gì hoạt động tốt nhất cho nhu cầu cụ thể của bạn. Mỗi người dùng phải xác định những gì hoạt động cho hệ thống của họ thay vì sử dụng phương pháp cắt cookie.

Tôi ví dụ có một máy chủ phương tiện với một vài tệp rất lớn. Kết quả chỉ có khoảng 400 tệp lấp đầy ổ đĩa 3 TB. Chỉ có 1% số lượng nút được sử dụng nhưng 95% tổng dung lượng được sử dụng. Một số người khác, với rất nhiều tệp nhỏ hơn có thể hết inodes trước khi chúng đến gần để lấp đầy không gian. (Trên các hệ thống tệp ext4 như một quy tắc chung, 1 inode được sử dụng cho mỗi tệp / thư mục.) Trong khi về mặt lý thuyết, tổng số tệp có thể chứa trong một thư mục là gần như vô hạn, tính thực tế xác định rằng việc sử dụng tổng thể xác định đơn vị thực tế, không phải chỉ có khả năng hệ thống tập tin.

Tôi hy vọng rằng tất cả các câu trả lời khác nhau ở trên đã thúc đẩy suy nghĩ và giải quyết vấn đề thay vì đưa ra một rào cản không thể vượt qua để tiến bộ.


4

Tôi nhớ lại việc chạy một chương trình tạo ra một lượng lớn tệp ở đầu ra. Các tập tin được sắp xếp ở mức 30000 mỗi thư mục. Tôi không nhớ có bất kỳ vấn đề đọc nào khi tôi phải sử dụng lại đầu ra được sản xuất. Đó là trên một máy tính xách tay Ubuntu Linux 32 bit và thậm chí Nautilus đã hiển thị nội dung thư mục, mặc dù sau vài giây.

Hệ thống tập tin ext3: Mã tương tự trên hệ thống 64 bit xử lý tốt với 64000 tệp trên mỗi thư mục.


4

"Phụ thuộc vào hệ thống tệp"
Một số người dùng đã đề cập rằng tác động hiệu suất phụ thuộc vào hệ thống tệp được sử dụng. Tất nhiên. Các hệ thống tập tin như EXT3 có thể rất chậm. Nhưng ngay cả khi bạn sử dụng EXT4 hoặc XFS bạn không thể ngăn chặn điều đó liệt kê một thư mục thông qua lshoặc findhoặc thông qua một kết nối bên ngoài như FTP sẽ trở nên chậm hơn một chậm hơn.

Giải pháp
tôi thích cách tương tự như @armandino . Vì vậy, tôi sử dụng hàm nhỏ này trong PHP để chuyển đổi ID thành filepath cho kết quả 1000 tệp trên mỗi thư mục:

function dynamic_path($int) {
    // 1000 = 1000 files per dir
    // 10000 = 10000 files per dir
    // 2 = 100 dirs per dir
    // 3 = 1000 dirs per dir
    return implode('/', str_split(intval($int / 1000), 2)) . '/';
}

hoặc bạn có thể sử dụng phiên bản thứ hai nếu bạn muốn sử dụng các ký tự chữ và số:

function dynamic_path2($str) {
    // 26 alpha + 10 num + 3 special chars (._-) = 39 combinations
    // -1 = 39^2 = 1521 files per dir
    // -2 = 39^3 = 59319 files per dir (if every combination exists)
    $left = substr($str, 0, -1);
    return implode('/', str_split($left ? $left : $str[0], 2)) . '/';
}

các kết quả:

<?php
$files = explode(',', '1.jpg,12.jpg,123.jpg,999.jpg,1000.jpg,1234.jpg,1999.jpg,2000.jpg,12345.jpg,123456.jpg,1234567.jpg,12345678.jpg,123456789.jpg');
foreach ($files as $file) {
    echo dynamic_path(basename($file, '.jpg')) . $file . PHP_EOL;
}
?>

1/1.jpg
1/12.jpg
1/123.jpg
1/999.jpg
1/1000.jpg
2/1234.jpg
2/1999.jpg
2/2000.jpg
13/12345.jpg
12/4/123456.jpg
12/35/1234567.jpg
12/34/6/12345678.jpg
12/34/57/123456789.jpg

<?php
$files = array_merge($files, explode(',', 'a.jpg,b.jpg,ab.jpg,abc.jpg,ddd.jpg,af_ff.jpg,abcd.jpg,akkk.jpg,bf.ff.jpg,abc-de.jpg,abcdef.jpg,abcdefg.jpg,abcdefgh.jpg,abcdefghi.jpg'));
foreach ($files as $file) {
    echo dynamic_path2(basename($file, '.jpg')) . $file . PHP_EOL;
}
?>

1/1.jpg
1/12.jpg
12/123.jpg
99/999.jpg
10/0/1000.jpg
12/3/1234.jpg
19/9/1999.jpg
20/0/2000.jpg
12/34/12345.jpg
12/34/5/123456.jpg
12/34/56/1234567.jpg
12/34/56/7/12345678.jpg
12/34/56/78/123456789.jpg
a/a.jpg
b/b.jpg
a/ab.jpg
ab/abc.jpg
dd/ddd.jpg
af/_f/af_ff.jpg
ab/c/abcd.jpg
ak/k/akkk.jpg
bf/.f/bf.ff.jpg
ab/c-/d/abc-de.jpg
ab/cd/e/abcdef.jpg
ab/cd/ef/abcdefg.jpg
ab/cd/ef/g/abcdefgh.jpg
ab/cd/ef/gh/abcdefghi.jpg

Như bạn có thể thấy đối với $int-version mỗi thư mục chứa tối đa 1000 tệp và tối đa 99 thư mục chứa 1000 tệp và 99 thư mục ...

Nhưng đừng quên rằng nhiều thư mục gây ra các vấn đề hiệu suất tương tự!

Cuối cùng, bạn nên suy nghĩ về cách giảm tổng số lượng tệp. Tùy thuộc vào mục tiêu của bạn, bạn có thể sử dụng các họa tiết CSS để kết hợp nhiều hình ảnh nhỏ như hình đại diện, biểu tượng, mặt cười, v.v. hoặc nếu bạn sử dụng nhiều tệp không phải phương tiện nhỏ, hãy xem xét kết hợp chúng, ví dụ như ở định dạng JSON. Trong trường hợp của tôi, tôi đã có hàng ngàn bộ nhớ cache nhỏ và cuối cùng tôi quyết định kết hợp chúng thành gói 10 cái.


3

Tôi tôn trọng điều này không hoàn toàn trả lời câu hỏi của bạn là có bao nhiêu là quá nhiều, nhưng một ý tưởng để giải quyết vấn đề dài hạn là ngoài việc lưu trữ siêu dữ liệu tệp gốc, còn lưu trữ thư mục nào trên đĩa - được chuẩn hóa ra đoạn siêu dữ liệu đó Khi một thư mục phát triển vượt quá giới hạn mà bạn cảm thấy thoải mái về hiệu suất, thẩm mỹ hoặc bất kỳ lý do gì, bạn chỉ cần tạo một thư mục thứ hai và bắt đầu thả các tệp ở đó ...


3

Tôi gặp phải một vấn đề tương tự. Tôi đã cố gắng truy cập vào một thư mục có hơn 10.000 tệp trong đó. Mất quá nhiều thời gian để xây dựng danh sách tệp và chạy bất kỳ loại lệnh nào trên bất kỳ tệp nào.

Tôi đã nghĩ ra một đoạn script php nhỏ để làm điều này cho chính mình và cố gắng tìm ra cách để ngăn chặn nó hết thời gian trong trình duyệt.

Sau đây là tập lệnh php tôi đã viết để giải quyết vấn đề.

Liệt kê các tệp trong một thư mục có quá nhiều tệp cho FTP

Nó giúp ai đó


1

Không phải là một câu trả lời, nhưng chỉ là một số gợi ý.

Chọn một FS phù hợp hơn (hệ thống tệp). Vì từ quan điểm lịch sử, tất cả các vấn đề của bạn đã đủ khôn ngoan, để trở thành trung tâm của các FS phát triển qua nhiều thập kỷ. Tôi có nghĩa là FS hiện đại hơn hỗ trợ tốt hơn các vấn đề của bạn. Trước tiên hãy lập bảng quyết định so sánh dựa trên mục đích cuối cùng của bạn từ danh sách FS .

Tôi nghĩ rằng đã đến lúc thay đổi mô hình của bạn. Vì vậy, cá nhân tôi đề nghị sử dụng một hệ thống phân tán nhận biết FS , có nghĩa là không có giới hạn nào về kích thước, số lượng tệp, v.v. Nếu không, bạn sẽ sớm bị thách thức bởi các vấn đề mới không lường trước được.

Tôi không chắc chắn để làm việc, nhưng nếu bạn không đề cập đến một số thử nghiệm, hãy thử AUFS trên hệ thống tệp hiện tại của bạn. Tôi đoán nó có các phương tiện để bắt chước nhiều thư mục như một thư mục ảo duy nhất.

Để vượt qua giới hạn phần cứng, bạn có thể sử dụng RAID-0.


1

Không có con số nào là "quá nhiều", miễn là nó không vượt quá giới hạn của HĐH. Tuy nhiên, càng nhiều tệp trong một thư mục, bất kể HĐH, thời gian truy cập bất kỳ tệp riêng lẻ nào càng lâu và trên hầu hết các hệ điều hành, hiệu suất là phi tuyến tính, do đó, để tìm một tệp trong số 10.000 phải mất hơn 10 lần sau đó để tìm một tập tin trong 1.000.

Các vấn đề thứ cấp liên quan đến việc có nhiều tệp trong một thư mục bao gồm các lỗi mở rộng thẻ hoang dã. Để giảm thiểu rủi ro, bạn có thể xem xét việc sắp xếp các thư mục của mình theo ngày tải lên hoặc một số siêu dữ liệu hữu ích khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.