Đặt nhiều (10 triệu) tệp trong một thư mục


17

Tôi vừa thêm một tính năng tìm kiếm dự đoán (xem ví dụ bên dưới) vào trang web của tôi chạy trên Máy chủ Ubuntu. Điều này chạy trực tiếp từ cơ sở dữ liệu. Tôi muốn lưu trữ kết quả cho mỗi tìm kiếm và sử dụng nếu nó tồn tại, người khác sẽ tạo nó.

Có vấn đề gì với tôi khi lưu 10 triệu kết quả tiềm năng trong các tệp riêng biệt trong một thư mục không? Hoặc có nên chia chúng thành các thư mục không?

Thí dụ:


5
Nó sẽ tốt hơn để chia. Bất kỳ lệnh nào cố gắng liệt kê nội dung của thư mục đó sẽ có khả năng tự quyết định.
muru

8
Vì vậy, nếu bạn đã có một cơ sở dữ liệu, tại sao không sử dụng nó? Tôi chắc chắn rằng DBMS sẽ có khả năng xử lý tốt hơn hàng triệu bản ghi so với hệ thống tệp. Nếu bạn không sử dụng hệ thống tập tin, bạn cần đưa ra sơ đồ chia tách bằng cách sử dụng một loại băm nào đó, tại thời điểm này IMHO có vẻ như sử dụng DB sẽ ít hoạt động hơn.
roadmr

3
Một tùy chọn khác cho bộ nhớ đệm phù hợp với mô hình của bạn tốt hơn có thể là memcached hoặc redis. Chúng là các cửa hàng giá trị chính (vì vậy chúng hoạt động như một thư mục duy nhất và bạn truy cập các mục chỉ bằng tên). Redis vẫn tồn tại (sẽ không mất dữ liệu khi được khởi động lại) khi mà memcached dành cho các mục tạm thời hơn.
Stephen Ostermiller 11/2/2015

2
Có một vấn đề gà và trứng ở đây. Các nhà phát triển công cụ không xử lý các thư mục có số lượng lớn tệp vì mọi người không làm điều đó. Và mọi người không tạo thư mục với số lượng lớn tệp vì các công cụ không hỗ trợ tốt. ví dụ: tôi hiểu tại một thời điểm (và tôi tin rằng điều này vẫn đúng), một yêu cầu tính năng để tạo phiên bản trình tạo của os.listdirpython đã bị từ chối thẳng thừng vì lý do này.

Từ kinh nghiệm của bản thân tôi, tôi đã thấy bị hỏng khi vượt quá 32k tệp trong một thư mục trên Linux 2.6. Tất nhiên là có thể điều chỉnh vượt quá điểm này, nhưng tôi không khuyến nghị điều đó. Chỉ cần chia thành một vài lớp thư mục con và nó sẽ tốt hơn nhiều. Cá nhân tôi sẽ giới hạn ở mức khoảng 10.000 mỗi thư mục sẽ cung cấp cho bạn 2 lớp.
Wolph

Câu trả lời:


25

Có vấn đề gì với tôi khi lưu khoảng 10 triệu kết quả tiềm năng trong các tệp riêng biệt trong một thư mục không?

Đúng. Có thể có nhiều lý do hơn nhưng những điều này tôi có thể đăng lên khỏi đỉnh đầu của mình:

  • tune2fscó một tùy chọn được gọi là dir_indexcó xu hướng được bật theo mặc định (trên Ubuntu), cho phép bạn lưu trữ khoảng 100 nghìn tệp trong một thư mục trước khi bạn thấy một cú đánh hiệu suất. Điều đó thậm chí không gần với các tệp 10m bạn đang nghĩ đến.

  • exthệ thống tập tin có số lượng nút tối đa cố định. Mỗi tập tin và thư mục sử dụng 1 inode. Sử dụng df -iđể xem các phân vùng và inodes miễn phí. Khi bạn hết inodes, bạn không thể tạo các tệp hoặc thư mục mới.

  • các lệnh như rmlskhi sử dụng ký tự đại diện sẽ mở rộng lệnh và sẽ kết thúc bằng một "danh sách đối số quá dài". Bạn sẽ phải sử dụng findđể xóa hoặc liệt kê các tập tin. Và findcó xu hướng chậm.

Hoặc có nên chia chúng thành các thư mục không?

Đúng. Chắc chắn nhất. Về cơ bản, bạn thậm chí không thể lưu trữ các tệp 10m trong 1 thư mục.

Tôi sẽ sử dụng cơ sở dữ liệu. Nếu bạn muốn lưu trữ bộ đệm cho trang web, hãy xem " solr " ("cung cấp lập chỉ mục phân tán, sao chép và truy vấn cân bằng tải").


8

Kết thúc với cùng một vấn đề. Chạy điểm chuẩn của riêng tôi để tìm hiểu xem bạn có thể đặt mọi thứ trong cùng một thư mục so với việc có nhiều thư mục không. Nó xuất hiện bạn có thể và nó nhanh hơn!

Điểm chuẩn

Tham chiếu: https://medium.com/@hartator/benchmark-deep-directory-structure-vs-flat-directory-structure-to-store-millions-of-files-on-ext4-cac1000ca28


1
Cảm ơn, điều này rất hữu ích. Tôi đang sử dụng điều này trên một trang web và đó là một vấn đề thực sự khi lập trình lại phần này để có cấu trúc thư mục /abc/efg.html. Vì vậy, tôi sẽ chuyển trở lại một thư mục phẳng trong tương lai.
Kohjah Breese

0

Một tìm kiếm nhị phân có thể dễ dàng xử lý hàng triệu bản ghi vì vậy việc tìm kiếm thư mục đơn sẽ không thành vấn đề. Nó sẽ làm rất nhanh.

Về cơ bản nếu bạn đang sử dụng hệ thống 32 bit, tìm kiếm nhị phân lên tới 2Gb bản ghi là dễ dàng và tốt.

Berekely DB, một phần mềm nguồn mở, sẽ dễ dàng cho phép bạn lưu trữ toàn bộ kết quả dưới một mục nhập và sẽ có sẵn tìm kiếm.

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.