Faux pas: วิธี "เร็ว" ที่ฉันพูดถึงข้างล่างนี้ไม่ได้เร็วกว่าวิธีช้า 60 เท่า เร็วกว่า 30 เท่า ฉันจะโทษความผิดพลาดในชั่วโมงนั้น (3AM ไม่ใช่เวลาที่ดีที่สุดของฉันสำหรับการคิดที่ชัดเจน :) ..
อัปเดต: ฉันได้เพิ่มบทสรุปของเวลาทดสอบ (ด้านล่าง)
ดูเหมือนจะมีสองประเด็นที่เกี่ยวข้องกับปัจจัยด้านความเร็ว:
- ตัวเลือกของคำสั่งที่ใช้ (การเปรียบเทียบเวลาที่แสดงด้านล่าง)
- ลักษณะของไฟล์จำนวนมากในไดเรกทอรี ... ดูเหมือนว่า "ใหญ่ไม่ดี" ทุกอย่างช้าลงอย่างไม่เป็นสัดส่วนเมื่อจำนวนเพิ่มขึ้น ..
การทดสอบทั้งหมดเสร็จสิ้นด้วย 1 ล้านไฟล์
(เวลาจริงผู้ใช้และ sys อยู่ในสคริปต์ทดสอบ)
สคริปต์ทดสอบสามารถพบได้ที่paste.ubuntu.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
#
ฉันเพิ่งสร้างและลบไฟล์ทดสอบเปล่า10ล้านไฟล์ การลบไฟล์ตามชื่อ (เช่นrm filename
) ฉันพบวิธีที่ยากที่จะมีความแตกต่างครั้งใหญ่ระหว่าง 2 วิธีที่แตกต่างกัน ...
ทั้งสองวิธีใช้rm filename
คำสั่ง เดียวกันแน่นอน
อัปเดต: ตามที่ปรากฏคำสั่งนั้นไม่เหมือนกัน ... หนึ่งในนั้นกำลังส่ง 1,000 ชื่อไฟล์พร้อมกันเป็น 'rm' ... มันเป็นปัญหาของการขยายตัวของเชลล์ที่ฉันคิดว่าแต่ละชื่อไฟล์ถูกเขียน ไปยังไฟล์ feeder บนบรรทัดของมันเอง แต่จริงๆแล้วมันคือ 1,000 ต่อบรรทัด
ชื่อไฟล์จะถูกจัดเตรียมผ่าน 'ไฟล์ตัวป้อน' ลงในwhile read
ลูป ..
ไฟล์ของตัวป้อนข้อมูลเป็นผลลัพธ์ของls -1 -f
วิธีการนี้เหมือนกันในการตรวจหาซ้ำทั้งหมดยกเว้นสิ่งเดียว:
- ช้าวิธีใช้แฟ้มป้อนไม่ได้เรียงลำดับโดยตรง
ls -1 -f
- รวดเร็ววิธีใช้รุ่นที่เรียงลำดับของไฟล์ไม่ได้เรียงลำดับเดียวกัน
ฉันไม่แน่ใจว่าการเรียงลำดับเป็นปัญหาที่นี่หรืออาจเป็นไปได้ว่าไฟล์ตัวเรียงลำดับเพิ่งเกิดขึ้นเพื่อให้ตรงกับลำดับที่ไฟล์ถูกสร้างขึ้น (ฉันใช้อัลกอริธึมจำนวนเต็มน้อยไปหามาก)
สำหรับไฟล์ 1 ล้านไฟล์วิธีที่รวดเร็ว rm filename
คือเร็วกว่าวิธีที่ช้ากว่า60เท่า... อีกครั้งฉันไม่รู้ว่านี่เป็นปัญหา "การเรียงลำดับ" หรือปัญหาแฮชหลังโต๊ะ ... ฉันสงสัยว่า มันไม่ได้เป็นปัญหาที่ง่ายเรียงลำดับเพราะทำไมจะจงใจให้ฉันunsortรายการเพิ่มสด "เรียง" ลำดับของชื่อไฟล์ ... ls -1 -f
ฉันแค่สงสัยว่าเกิดอะไรขึ้นที่นี่ดังนั้นจึงไม่ใช้เวลาหลายวัน (ใช่วัน) ในการลบไฟล์ 10 ล้านไฟล์ถัดไป :) .... ฉันพูดว่า "วัน" เพราะฉันลองใช้ตัวเลือกมากมายและ จำนวนครั้งที่เกี่ยวข้องเพิ่มขึ้นอย่างไม่เป็นสัดส่วนกับจำนวนไฟล์ที่เกี่ยวข้อง .. ดังนั้นฉันจึงทดสอบรายละเอียดเพียง1ล้านเท่านั้น
BTW: การลบไฟล์ผ่านทาง "รายการเรียงลำดับ" ของชื่อจริงเร็วกว่าrm -rf
โดยใช้ตัวคูณของ 2
และ: rm -r
ช้ากว่าวิธีเรียงลำดับรายการ 30 ครั้ง
... แต่ "เรียงลำดับ" เป็นปัญหาที่นี่หรือไม่ หรือมันเกี่ยวข้องกับวิธี hashing (หรืออะไรก็ตาม) ของการจัดเก็บที่ใช้โดย ext4?
สิ่งที่ค่อนข้างลึกลับสำหรับฉันคือการโทรแต่ละครั้งrm filename
ไม่เกี่ยวข้องกับการโทรก่อนหน้า .. (อย่างน้อยก็เป็นอย่างนั้นจากมุมมอง 'ทุบตี')
ฉันใช้ Ubuntu / bash / 'ext4' / ไดรฟ์ SATA II
cat
ก่อนการทดสอบครั้งที่ 1 - sort
ก่อนการทดสอบครั้งที่ 2
find -delete
หรือ