Tại sao xóa các tập tin theo tên rất chậm và cũng đặc biệt nhanh?


11

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 filenamelệ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 readvò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 -fcố ý 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 -rfhệ số 2.
và: rm -rchậ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 filenamekhô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.


1
Bạn đang làm sai! (tm) Bạn đã từng nghe về find -delete?
alex

2 bài kiểm tra của bạn bắt đầu trong điều kiện không đồng đều (tôi không giả vờ điều này thực sự quan trọng): một bài đọc tên tệp từ một tệp và phần còn lại đọc tên tệp từ tệp đã được tạo (sắp xếp) ngay trước khi kiểm tra. Có thể là tệp được lưu trong bộ nhớ cache trong trường hợp thứ 2 phát một số (hoặc có thể không, ai biết). Để các bài kiểm tra ở trong điều kiện bình đẳng hơn, có lẽ bạn nên thực hiện đơn giản catvới một tệp mới trước bài kiểm tra thứ nhất - thay cho sorttrước bài kiểm tra thứ hai.
imz - Ivan Zakharyaschev

Và tôi khuyên bạn nên trình bày những quan sát và câu hỏi của bạn một cách rõ ràng hơn. Xin vui lòng, một điều tại một thời điểm: so sánh chỉ 2 trường hợp trong một câu hỏi, đưa hai trường hợp quan trọng đến sân trước, tất cả những thứ khác chỉ là thông tin cơ bản; hãy làm rõ điều này Đừng trộn lẫn nhiều quan sát trong một bài viết, xin vui lòng.
imz - Ivan Zakharyaschev

Trình bày hệ thống và thời gian không gian người dùng từ bạn cũng có thể quan trọng để giải câu đố, vì vậy vui lòng đưa chúng vào câu hỏi của bạn. Những người trong số họ làm cho sự khác biệt lớn trong các bài kiểm tra của bạn?
imz - Ivan Zakharyaschev

1
Tối ưu hóa sớm là gốc rễ của mọi tội lỗi. :) Khi nào bạn sẽ xóa 10 triệu tệp? 100 000 mỗi giây dường như đủ nhanh với tôi (để phá hỏng hệ thống của bạn).
người dùng không xác định

Câu trả lời:


2

rm -r dự kiến ​​sẽ chậm vì đệ quy của nó. Một chiều sâu đầu tiên phải được thực hiện trên cấu trúc thư mục.

Bây giờ bạn đã tạo 10 triệu tệp như thế nào? bạn đã sử dụng một số kịch bản vòng lặp trên một số thứ tự? 1.txt, 2.txt, 3.txt ... nếu có thì các tệp đó cũng có thể được phân bổ theo cùng một thứ tự trong các khối tiếp giáp trong hdd.so xóa theo cùng một thứ tự sẽ nhanh hơn.

"ls -f" sẽ kích hoạt -aU liệt kê theo thứ tự thư mục một lần nữa được đệ quy.


1
McAlot: Tôi không thể thấy 'đệ quy' sẽ quan trọng như thế nào trong trường hợp này , vì không có thư mục con nào liên quan ... Có tôi đã sử dụng "1.txt, 2.txt, 3.txt '. Có lẽ có một số mọi thứ tương tác: ví dụ: Tại sao chỉ mất 1 phút 30 giây để tạo 1 triệu tệp, nhưng phải mất 7 triệu 10 giây để tạo 2 triệu và sau khi xóa chúng, việc tạo lại 1 triệu mất nhiều thời gian hơn (9m 30 giây) Thật chậm rãi. Điều này cũng xảy ra trước đây. Tôi nghĩ rằng (?) xóa thư mục đã sửa nó. Có thể có một daemon tập tin (nautilus; xác định vị trí) không? Để được tiếp tục ...
Peter.O

Nói chung, các hệ thống tệp không được tối ưu hóa để xử lý số lượng lớn tệp trong cùng thư mục. Tôi không quen thuộc với ext4, nhưng đối với các định dạng khác, các mục trong thư mục chỉ được đánh dấu là không sử dụng khi các tệp bị xóa. Điều đó có nghĩa là chúng vẫn phải được bỏ qua khi thực hiện các thao tác trong thư mục. Điều đó sẽ giải thích hành vi mà bạn đang nhìn thấy.
KeithB

1
Tôi đã xóa thư mục 'bây giờ chậm hơn' và sử dụng một tên khác cho một thư mục mới. Thời gian để tạo 1 triệu tệp bây giờ đã giảm xuống còn 1m 33 (so với 9 triệu 30 khi thư mục "chứa" 2 triệu tệp đã bị xóa, một triệu đầu tiên có cùng tên với 1 triệu tệp mới được thêm vào) ... thật thú vị, và nó những người bạn thân với bình luận "... chỉ được đánh dấu là không sử dụng" ... đến đó; nó bắt đầu có ý nghĩa :)
Peter.O

@ fred.bear Thật tệ, tôi thực sự không biết thứ bậc thực tế và câu trả lời của tôi là đoán. Ngoài ra, bài kiểm tra của bạn thực sự nhấn mạnh siêu dữ liệu chứ không phải các tệp thực tế vì chúng là các tệp trống. Cách tốt nhất để đánh giá loại vấn đề này là lấy các tệp từ / var hoặc bộ đệm của máy chủ web. dù sao bài kiểm tra của bạn cũng nghe có vẻ khó hiểu, bạn có thể thử xóa bằng hai phương thức được liệt kê trong các thư mục khác nhau..hãy như /sample1/1.txt,2.txt ... và /sample2/1.txt,2.txt ..
rajaganesh87

@ Mr.Confuse.A.Lot ... Cảm ơn bạn đã giúp đỡ. Giải thích của bạn đã giúp tôi hiểu thêm về hệ thống tập tin và một số cách thức của nó ... Bây giờ tôi đã có ý thức hợp lý về nguyên nhân gây ra các vấn đề tốc độ khác nhau ... một số chỉ là sự lựa chọn của các lệnh bash, và một số khác chỉ là vấn đề về hệ thống tập tin ( Tôi để lại một phương châm mới: "lớn là xấu" cho các thư mục ... (ít nhất là đối với một số hành động) ...
Peter.O

2

Bạn nên tối ưu hóa cấu trúc filestr. Vì vậy, thay vì

for i in $(seq 1 1000); do touch file.$i; done

làm một cái gì đó thông minh hơn như (bash giả định):

function bucklocate() 
{ 
    hash=$(echo -n "$1"|md5sum|cut -f1); 
    echo -n "${hash:1:1}/${hash:7:1}/${hash:9:2}/$1"; 
}

hexdig="{0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f}"
eval mkdir -p $hexdig/$hexdig/$hexdig$hexdig


for i in $(seq 1 1000); do touch $(bucklocate file.$i); done

Bây giờ ví dụ này khá chậm vì sử dụng md5sum [1], sử dụng một cái gì đó như sau để phản hồi nhanh hơn nhiều, miễn là bạn không cần bất kỳ tên tệp cụ thể nào, các bản sao không phải lo ngại và không cần phải có hàm băm lặp lại của một tên nào đó :)

mkdir -pv {0,1,2,3,4,5,6}/{0,1,2,3,4,5,6,7,8,9,10,12}
for  a in $(seq 1 100); do i=$RANDOM; echo touch "$(($i%7))/$(($i%13))/file.$i"; done

Tất nhiên đây là tất cả các khái niệm vay mượn từ hashtables


Tôi nghĩ rằng bạn đang nói "sử dụng các thư mục nhỏ hơn" ... Đó là một ý tưởng xen kẽ; một DBMS được trồng tại nhà, tạo ra một cây từ một nhóm các tệp 'không có cây'. Một số người có thể gọi nó là lập kế hoạch chuyển tiếp :) ... Nếu nó hoạt động (và có lẽ là như vậy), thì đó là một ý tưởng hay ! :) ... Tôi bắt đầu có ý tưởng rằng 'lớn là xấu' khi nói đến số lượng tệp trong một thư mục (ít nhất là cho ext4) ... Bạn đã đưa ra một cách giải quyết ưu tiên (+1) và tôi ' Tôi đang dần hiểu được lý do tại sao một số phương pháp xóa nhanh hơn các phương thức khác trong bất kỳ thư mục cụ thể nào, dù nhỏ hay lớn ... Cảm ơn
Peter.O

Yup xin lỗi vì đã không nói rõ hơn về ý tưởng giữ các thư mục nhỏ
sehe
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.