ไฟล์ในไดเรกทอรีมีไฟล์มากเกินไป? (กำลังดาวน์โหลดข้อมูลจากเน็ต)


19

ทักทาย,

ฉันกำลังเขียนสคริปต์เพื่อประมวลผลภาพจากเว็บไซต์ภาพถ่ายต่างๆ ตอนนี้ฉันกำลังจัดเก็บข้อมูลทั้งหมดนี้ในไฟล์ข้อความแต่ละไฟล์ในไดเรกทอรีเดียวกัน

ไดเรกทอรีนี้สามารถเข้าถึงได้ทางเว็บ ผู้ใช้ปลายทางทำการโทรไปยังบริการเว็บซึ่งจะส่งคืนพา ธ ไปยังไฟล์ที่ผู้ใช้ต้องการ

ฉันสงสัยว่าขั้นตอนใดที่ฉันจะเห็นผลกระทบต่อประสิทธิภาพโดยการมีไฟล์เหล่านี้ทั้งหมดในไดเรกทอรีเดียวกัน (ถ้ามี)



เกี่ยวข้อง: superuser.com/q/453348/453247
Stephen R

คำตอบ:


12

ประสิทธิภาพการทำงานแตกต่างกันไปตามระบบไฟล์ที่คุณใช้

  • FAT: ลืมมัน :) (โอเคฉันคิดว่าขีด จำกัด คือ 512 ไฟล์ต่อไดเรกทอรี)
  • NTFS: แม้ว่ามันจะสามารถเก็บไฟล์ได้ 4 พันล้านไฟล์ต่อโฟลเดอร์ แต่ก็ลดระดับลงอย่างรวดเร็ว - ประมาณหนึ่งพันคุณจะเริ่มสังเกตเห็นปัญหาด้านประสิทธิภาพหลายพันคนและคุณจะเห็นว่า explorer ดูเหมือนจะหยุดอยู่พักหนึ่ง
  • EXT3: ขีด จำกัด ทางกายภาพคือ 32,000 ไฟล์ แต่ไฟล์ก็มีหลายพันไฟล์เช่นกัน

  • EXT4: ไม่ จำกัด ตามหลักวิชา

  • ReiserFS, XFS, JFS, BTRFS: สิ่งเหล่านี้เป็นไฟล์ที่ดีสำหรับไฟล์จำนวนมากเนื่องจากมีความทันสมัยและได้รับการออกแบบมาให้รองรับไฟล์จำนวนมาก . ประสิทธิภาพดีขึ้นมากสำหรับไฟล์จำนวนมาก (พร้อมกับ ext4) เนื่องจากทั้งคู่ใช้อัลกอริธึมชนิดการค้นหาแบบไบนารี่สำหรับการรับไฟล์ที่คุณต้องการ


6
นี่เป็นสิ่งที่ผิด ไม่มีข้อ จำกัด ของไฟล์ 32000 ใน EXT3 มีการ จำกัด ไดเรกทอรีย่อย 32000 รายการ ฉันมีไดเร็กตอรี่ที่นี่พร้อมไฟล์มากกว่า 300,000 ไฟล์และมันก็ทำงานได้ดี
davidsheldon

1
ค่อนข้างเป็นจริง - ขีด จำกัด ของไฟล์เป็นขีด จำกัด ของระบบไฟล์ทั้งหมดใน inodes แต่คุณ จำกัด การเชื่อมโยง 32k (เช่น subdir)
gbjbaanb

คำสั่งสำหรับ NTFS ปัจจุบันยังไม่เป็นความจริงก็สามารถถือได้ถึง 4294967295 (2 ^ 32-1): technet.microsoft.com/en-us/library/cc781134%28WS.10%29.aspx
Fleshgrinder

อย่าสับสนระหว่างไดเรกทอรีย่อยกับไฟล์บนเครื่อง CentOS ฉันมี 32000 ไดเรกทอรีย่อยถึงขีด จำกัด ฉันย้ายไฟล์ทั้งหมดในไดเรกทอรีเดียวและยังใช้งานได้ดี
adrianTNT


8

ฉันจัดเก็บภาพเพื่อแสดงโดยเว็บเซิร์ฟเวอร์และฉันมีภาพมากกว่า 300,000 ภาพในไดเรกทอรีเดียวบน EXT3 ฉันไม่เห็นปัญหาด้านประสิทธิภาพ ก่อนทำการตั้งค่านี้ฉันทำการทดสอบด้วยภาพ 500k ในไดเรกทอรีและเข้าถึงไฟล์แบบสุ่มโดยใช้ชื่อและไม่มีการชะลอตัวที่สำคัญเมื่อ 500k มากกว่า 10k ภาพในไดเรกทอรี

ข้อเสียเพียงอย่างเดียวที่ฉันเห็นคือเพื่อที่จะซิงค์ไฟล์ใหม่ที่มีไฟล์สำรองที่สองฉันต้องเรียกใช้rsyncไดเรกทอรีทั้งหมดและไม่สามารถบอกให้ซิงค์ไดเรกทอรีย่อยที่ประกอบด้วยพันล่าสุดได้


การซิงก์กับเซิร์ฟเวอร์ตัวที่สองฉันคิดว่าคุณต้องสร้างโครงสร้างและอัลกอริทึมที่รักษาการเปลี่ยนแปลงเอาไว้แล้วบันทึกนี้สามารถช่วยคุณประหยัดเวลาได้มาก
Bahadir Tasdemir

+1 นี่จริงตอบคำถาม
kubanczyk

ข้อเสียเดียวถ้าคุณใช้ไคลเอนต์ FTP เช่น FileZilla และต้องการแสดงรายการเนื้อหาของโฟลเดอร์มันใช้เวลาสักครู่
Kai Noack

3

ปริมาณของไฟล์ในโฟลเดอร์ในทางทฤษฎีอาจไม่มีขีด จำกัด อย่างไรก็ตามทุกครั้งที่ระบบปฏิบัติการจะเข้าถึงโฟลเดอร์เฉพาะเพื่อค้นหาไฟล์มันจะต้องประมวลผลไฟล์ทั้งหมดในโฟลเดอร์ ด้วยไฟล์น้อยกว่า 500 ไฟล์คุณอาจไม่สังเกตเห็นความล่าช้า แต่เมื่อคุณมีไฟล์หลายหมื่นไฟล์ในโฟลเดอร์เดียวคำสั่งรายการโฟลเดอร์อย่างง่าย (ls หรือ dir) อาจใช้เวลานานเกินไป เมื่อโฟลเดอร์เหล่านี้สามารถเข้าถึงได้ผ่านทาง FTP มันจะช้าเกินไป ...

ปัญหาด้านประสิทธิภาพจะไม่ขึ้นอยู่กับระบบปฏิบัติการของคุณ แต่ขึ้นอยู่กับความเร็วของโปรเซสเซอร์ระบบความจุดิสก์และหน่วยความจำ หากคุณมีไฟล์จำนวนมากคุณอาจต้องการรวมไฟล์เหล่านั้นลงในไฟล์เก็บถาวรเดียวและใช้ระบบเก็บถาวรที่ปรับให้เหมาะสมเพื่อเก็บข้อมูลจำนวนมาก นี่อาจเป็นไฟล์ ZIP แต่ยังดีกว่าเก็บไว้เป็น blobs ในฐานข้อมูลด้วยชื่อไฟล์เป็นคีย์หลัก


แต่การเข้าถึงไฟล์จะลบคอขวดโดยตรงด้วยการค้นหาไดเรคทอรี่หรือจะเข้าถึงไดเร็กตอรี่ที่ยังมีการค้นหาพื้นฐานอยู่? (Linux, debian)
steve

3
การเข้าถึงไฟล์โดยตรงจะช่วยลดปัญหาเหล่านี้ ฉันได้ทำการทดสอบกับ ext3 แล้วและการเข้าถึงไฟล์ตามชื่อในไดเรกทอรีที่มีไฟล์ 500,000 ไฟล์นั้นไม่ได้ช้ากว่าที่มี 1,000 อย่างมากเห็นได้ชัดว่าการทำlsปัญหาเป็นปัญหา
davidsheldon

เมื่อทราบชื่อที่ถูกต้องการเข้าถึงควรรวดเร็ว ปัญหาส่วนใหญ่จะเป็นรหัสหรือคำสั่งใด ๆ ที่ต้องการรับรายการไฟล์
Wim ten Brink

1

กฎง่ายๆของฉันคือการแยกโฟลเดอร์หากมีมากกว่า 1,000 ไฟล์และโฟลเดอร์จะถูกเรียกดู (เช่นผ่านอินเทอร์เน็ตหรือ Explorer) หรือไฟล์ 5000


0

@skaffman ชี้ให้เห็นข้อ จำกัด ขึ้นอยู่กับระบบปฏิบัติการ คุณอาจได้รับผลกระทบจากข้อ จำกัด ของระบบปฏิบัติการรุ่นเก่า ฉันจำได้ว่า Solaris รุ่นเก่า จำกัด อยู่ที่ 32768 ไฟล์ต่อไดเรกทอรี

วิธีแก้ไขปัญหาปกติคือใช้ hashing บางประเภทเช่น Cyrus imap server แยกผู้ใช้โดยแฮชตัวอักษร:

/var/spool/imap/a/user/anna/
/var/spool/imap/a/user/albert/
/var/spool/imap/d/user/dan/
/var/spool/imap/e/user/ewan/

1
ขอบคุณฉันมีสิ่งที่แน่นอนเมื่อ dir มีไฟล์มากกว่า 2k! :)
สตีฟ

คำถามนี้มีคำตอบที่ดี: serverfault.com/questions/95444/…
davey

กฎทั่วไปของฉันคือกว่า 20,000 ไฟล์ในไดเรกทอรีไม่ใช่ความคิดที่ดี ระบบไฟล์ที่ทันสมัยส่วนใหญ่ทำได้ดีกับไฟล์จำนวนมาก เมื่อคุณกดไฟล์ 32k ในไดเรกทอรีระบบไฟล์บางอย่างเช่น ext3 จะเริ่มมีปัญหาประสิทธิภาพการทำงานที่รุนแรง
Phil Hollenback

Phil - คุณมีข้อมูลใด ๆ เกี่ยวกับปัญหาด้านประสิทธิภาพของไฟล์ที่เกิน 32k กับ ext3 ฉันไม่เห็นอะไรเลยในตอนนี้ที่มีมากกว่า 300k บางทีอาจเป็นสิ่งที่ไม่ส่งผลกระทบต่อรูปแบบการใช้งานของฉัน
davidsheldon

ซอฟต์แวร์ทางวิทยาศาสตร์ของงานก่อนหน้าของฉันจะสร้างไฟล์ขนาดเล็กจำนวนมาก (ไม่กี่ไฟล์ในแต่ละไฟล์) ในไดเรกทอรี แน่นอนเราเห็นว่าสำหรับไดเรกทอรีไฟล์> 32k อ่านเวลาจะยิงขึ้นอย่างมาก เพียงแค่เรียกใช้ 'ls' ในไดเรกทอรีที่มีไฟล์จำนวนมากอาจใช้เวลาหนึ่งนาทีหรือมากกว่านั้น
Phil Hollenback

0

หากคุณเข้าถึงไฟล์โดยตรงจำนวนไฟล์ในไดเรกทอรีจะไม่มีปัญหาเรื่องความเร็ว

จำนวนไฟล์ที่คุณสามารถสร้างในไดเรกทอรีเดียวนั้นขึ้นอยู่กับระบบไฟล์ที่คุณใช้ หากคุณกำลังแสดงรายการไฟล์ทั้งหมดในไดเรกทอรีหรือการค้นหาการเรียงลำดับ ฯลฯ การมีไฟล์จำนวนมากจะทำให้การดำเนินการเหล่านั้นช้าลง

gbjbaanb ตอบผิดเกี่ยวกับขนาดไฟล์สูงสุดของ ext3 โดยทั่วไป ext จำกัด จำนวนไฟล์ในแผ่นดิสก์ของคุณโดยทั่วไป คุณไม่สามารถสร้างไฟล์เพิ่มเติมแล้วคุณมี inodes ในตาราง inode ของคุณ เขาถูกต้องในการแนะนำ reiserfs สำหรับประสิทธิภาพที่มากขึ้นด้วยไฟล์จำนวนมาก


0

โฟลเดอร์ที่ตรวจสอบพร้อมไฟล์ 10K ใน NTFS (Windows 7, 64 บิต) โฟลเดอร์ที่มีภาพ 10K ในทุกมุมมอง (รายการไอคอนและอื่น ๆ ) สามารถใช้งานและเลื่อนได้โดยไม่เกิดความล่าช้า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.