Faux pas: Phương pháp "nhanh" mà tôi đề cập dưới đây, không nhanh hơn 60 lần so với phương pháp chậm. Nó nhanh hơn 30 lần. Tôi sẽ đổ lỗi cho giờ sai lầm (3 giờ sáng không phải là thời điểm tốt nhất trong ngày của tôi để suy nghĩ rõ ràng :) ..
Cập nhật: Tôi đã thêm một bản tóm tắt về thời gian thử nghiệm (bên dưới).
Dường như có hai vấn đề liên quan đến yếu tố tốc độ:
- Lựa chọn lệnh được sử dụng (So sánh thời gian hiển thị bên dưới)
- Bản chất của số lượng lớn các tệp trong một thư mục ... Có vẻ như "lớn là xấu". Mọi thứ trở nên chậm chạp một cách bất thường khi số lượng tăng lên ..
Tất cả các bài kiểm tra đã được thực hiện với 1 triệu tệp.
(thời gian thực, người dùng và sys có trong tập lệnh thử nghiệm)
Tập lệnh kiểm tra có thể được tìm thấy tại paste.ubfox.com
#
# 1 million files
# ===============
#
# |time |new dir |Files added in ASCENDING order
# +---- +------- +-------------------------------------------------
# real 01m 33s Add files only (ASCENDING order) ...just for ref.
# real 02m 04s Add files, and make 'rm' source (ASCENDING order)
# Add files, and make 'rm' source (DESCENDING order)
# real 00m 01s Count of filenames
# real 00m 01s List of filenames, one per line
# ---- ------- ------
# real 01m 34s 'rm -rf dir'
# real 01m 33s 'rm filename' via rm1000filesPerCall (1000 files per 'rm' call)
# real 01m 40s 'rm filename' via ASCENDING algorithm (1000 files per 'rm' call)
# real 01m 46s 'rm filename' via DESCENDING algorithm (1000 files per 'rm' call)
# real 21m 14s 'rm -r dir'
# real 21m 27s 'find dir -name "hello*" -print0 | xargs -0 -n 1000 rm'
# real 21m 56s 'find dir -name "hello*" -delete'
# real 23m 09s 'find dir -name "hello*" -print0 | xargs -0 -P 0 rm'
# real 39m 44s 'rm filename' (one file per rm call) ASCENDING
# real 47m 26s 'rm filename' (one file per rm call) UNSORTED
#
Gần đây tôi đã tạo và xóa 10 triệu tệp thử nghiệm trống. Xóa các tệp trên một tên theo cơ sở tên (ví dụ rm filename
), tôi phát hiện ra một cách khó khăn là có sự khác biệt lớn về thời gian giữa 2 phương pháp khác nhau ...
Cả hai phương pháp đều sử dụng cùng một rm filename
lệnh.
Cập nhật: hóa ra, các lệnh không hoàn toàn giống nhau ... Một trong số chúng đã gửi 1000 tên tệp cùng một lúc đến 'rm' ... Đó là một vấn đề mở rộng niềng răng trong đó tôi nghĩ rằng mỗi tên tệp được viết đến tệp trung chuyển trên một dòng của riêng nó, nhưng thực tế nó là 1000 trên mỗi dòng
Tên tệp được cung cấp thông qua 'tệp trung chuyển' thành một while read
vòng lặp ..
Tệp trung chuyển là đầu ra của ls -1 -f
Phương thức giống hệt nhau trong tất cả các reaspects, ngoại trừ một điều:
- các chậm phương pháp sử dụng các tập tin nạp không được phân loại trực tiếp từ
ls -1 -f
- các nhanh chóng phương pháp sử dụng một phiên bản sắp xếp các tập tin mà không được phân loại tương tự
Tôi không chắc liệu việc sắp xếp có phải là vấn đề ở đây không, hoặc có lẽ là tập tin nạp được sắp xếp chỉ xảy ra để khớp với trình tự mà các tệp được tạo ra (tôi đã sử dụng thuật toán số nguyên tăng dần đơn giản)
Đối với 1 triệu tác phẩm, nhanh chóng rm filename
phương pháp là 60 nhanh hơn so với thời gian chậm phương pháp ... một lần nữa, tôi không biết nếu điều này là một "sắp xếp" vấn đề, hoặc một vấn đề bảng đằng sau hậu trường băm ... Tôi nghi ngờ nó không phải là một vấn đề đơn giản phân loại, bởi vì tại sao ls -1 -f
cố ý cho tôi một unsort niêm yết của một chuỗi tươi thêm "sắp xếp" của tên tập tin ...
Tôi chỉ tự hỏi điều gì đang xảy ra ở đây, vì vậy tôi không mất 10 ngày (có ngày) để xóa 10 triệu tệp tiếp theo :) .... Tôi nói "ngày" vì tôi đã thử rất nhiều lựa chọn thay thế và số lần liên quan tăng không tương xứng với tập tin numberof có liên quan .. vì vậy tôi chỉ kiểm tra chi tiết 1 triệu
BTW: Xóa các tệp qua "danh sách được sắp xếp" tên thực sự nhanh hơn rm -rf
hệ số 2.
và: rm -r
chậm hơn 30 lần so với phương pháp "danh sách được sắp xếp"
... nhưng "sắp xếp" vấn đề ở đây? hoặc có liên quan nhiều hơn đến phương thức lưu trữ băm (hoặc bất cứ thứ gì) được sử dụng bởi ext4 không?
Điều khiến tôi khá bối rối là mỗi cuộc gọi đến rm filename
không liên quan đến cuộc gọi trước đó .. (tốt, ít nhất đó là theo cách nhìn từ quan điểm 'bash')
Tôi đang sử dụng ổ Ubuntu / bash / 'ext4' / SATA II.
cat
với một tệp mới trước bài kiểm tra thứ nhất - thay cho sort
trước bài kiểm tra thứ hai.
find -delete
?