ข้อ จำกัด ใด ๆ ที่มีไฟล์จำนวนมากในไดเรกทอรีใน Mac OS X?


9

ฉันมีไฟล์มากกว่า 100,000 ไฟล์ในไดเรกทอรีใน MacOS X ของฉันและดูเหมือนว่าสคริปต์ของฉันจะอ่านไฟล์ในนั้นช้า

มีข้อ จำกัด หรือข้อเสนอแนะที่จะมีไฟล์จำนวนมากหรือไม่? ฉันควรแยกพวกเขาออกเป็นบางไดเรกทอรีหรือไม่

ข้อ จำกัด ที่ฉันพบคือฉันทำไม่ได้mv * fooกับไฟล์ทั้งหมด 100,000 ไฟล์ มันแสดงข้อผิดพลาดว่า "อาร์กิวเมนต์ยาวเกินไป" มันทำงานได้กับไฟล์น้อยกว่า 20,000 ไฟล์


ขณะนี้ฉันมีไฟล์ 380,000 ไฟล์ในไดเรกทอรีและตระหนักว่าแม้การเปิดไฟล์จะใช้เวลาเพียง 10+ วินาที ฉันตัดสินใจแยกพวกมันออกเป็นบางไดเรกทอรี
Daisuki Honey

1
ระบบไฟล์ HFS + ควรสามารถจัดเก็บและเข้าถึงไฟล์จำนวนมากในไดเรกทอรีด้วยชื่อเต็มโดยไม่มีปัญหามากเกินไป แต่คุณต้องระวังด้วยสัญลักษณ์แทน เมื่อคุณใช้*หรือ?เป็นส่วนหนึ่งของอาร์กิวเมนต์ไปยังคำสั่งระบบปฏิบัติการจะค้นหาไดเรกทอรีทั้งหมดเพื่อจับคู่ไฟล์ (ช้า) จากนั้นจะแทนที่อาร์กิวเมนต์ของคุณด้วยรายการของไฟล์ที่ตรงกันทุกไฟล์ (ยาว) ซึ่งจะส่งผ่านไปยัง คำสั่ง คุณอาจจะทำอย่างไรดีกับวงหรือมีคำสั่ง mv mv a* foo && mv b* fooหลายเช่น
Matthias Fripp

คำตอบ:


1

ตามคำตอบของ Stack Overflowและรายละเอียดเฉพาะบนเว็บไซต์ของ Appleแต่ละโฟลเดอร์สามารถบรรจุรายการได้มากถึง 2.1 พันล้านรายการ

ที่กล่าวมาเพียงเพราะมันสามารถเก็บได้ถึง 2.1 พันล้านรายการไม่ได้หมายความว่ามันสามารถรักษาประสิทธิภาพในระดับนั้น ตามที่ Wikipedia ; เน้นเป็นของฉัน:

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

ดังนั้นประสิทธิภาพจึงลดลงตามธรรมชาติเนื่องจากความจริงที่ว่าไฟล์แค็ตตาล็อกสามารถใช้งานได้ครั้งละหนึ่งโปรแกรมเท่านั้น และถ้าไดเรกทอรีมีขนาดโตขึ้นความเสี่ยง / การเสื่อมสภาพที่เกิดจากปัญหานั้นจะเพิ่มขึ้นเท่านั้น ไฟล์เพิ่มเติมหมายถึงโอกาสที่โปรแกรมจะเข้าถึงไฟล์ในไดเรกทอรีเดียว ยืนยันเพิ่มเติมของความคิดที่นี่ ; ความสำคัญอีกครั้งคือของฉัน:

ไฟล์แคตตาล็อกเป็นโครงสร้างที่ซับซ้อน เนื่องจากมันเก็บข้อมูลไฟล์และไดเรกทอรีทั้งหมดมันจะบังคับให้ซีเรียลไลซ์เซชั่นของระบบไฟล์ไม่ใช่สถานการณ์ในอุดมคติเมื่อมีเธรดจำนวนมากที่ต้องการดำเนินการไฟล์ I / O ใน HFS การดำเนินการใด ๆ ที่สร้างไฟล์หรือแก้ไขไฟล์ในทางใดทางหนึ่งจะต้องล็อคไฟล์แคตตาล็อกซึ่งป้องกันไม่ให้เธรดอื่นสามารถเข้าถึงไฟล์แค็ตตาล็อกได้แบบอ่านอย่างเดียว การเข้าถึงไฟล์แคตตาล็อกจะต้องเป็น single-writer / multireader


ขอบคุณมาก. ฉันเข้าใจว่าการเข้าถึงไฟล์แคตตาล็อกจะเป็นปัญหาคอขวดและอาจทำให้เกิดปัญหาประสิทธิภาพร้ายแรงโดยเฉพาะอย่างยิ่งสำหรับการทำงานหลายอย่าง
Daisuki Honey

@DaisukiHoney ยินดีต้อนรับ! ดังนั้นหากคุณพบว่าคำตอบของฉันเป็นประโยชน์โปรดอย่าลืมโหวตให้มากขึ้น และหากเป็นคำตอบที่แก้ไขปัญหาของคุณโปรดอย่าลืมตรวจสอบเช่นนี้
JakeGould

ใช่แน่นอนฉันลงคะแนนคำตอบของคุณและตรวจสอบออก อีกครั้งขอบคุณมาก
Daisuki Honey

ส่วนวิกิพีเดียที่คุณกล่าวถึงมีการพูดคุยเกี่ยวกับการ จำกัด การปรับขยายระบบแฟ้มต่อไม่ต่อไดเรกทอรี: มีเพียงหนึ่งแคตตาล็อกไฟล์ต่อระบบแฟ้มและการเข้าถึงทุกคนจะต้องเป็นอันดับว่า มันค่อนข้างไม่เกี่ยวข้องกับคำถาม
Poolie

@poolie คำถามเกี่ยวกับไดเรกทอรีต่อที่มีอยู่ในระบบไฟล์ ไฟล์แค็ตตาล็อกมีต่อระบบไฟล์ แต่มีไดเร็กทอรีอยู่ในระบบไฟล์เดียวกัน มันเกี่ยวข้องกับคำถามที่เกี่ยวข้องกับ 10,000 ไฟล์ในไดเรกทอรีที่มีอยู่ในระบบไฟล์เดียว แต่คำถามนี้มีอายุ 2 ปีขึ้นไปดังนั้นขอขอบคุณสำหรับลิงค์ Wiki ฉันได้อัปเดตคำตอบของฉันเพื่อรวมข้อความใหม่และลิงก์โดยตรงไปยังหัวข้อที่เป็นปัญหา
JakeGould

4

คำตอบสั้น ๆ :ถ้าคุณอ่าน 100,000 ไฟล์ฉันอาจคาดหวังให้สคริปต์ทำงานช้า

คำตอบยาว:เพื่อตอบคำถามนี้ให้ละเอียดยิ่งขึ้นคุณต้องดูระบบไฟล์บน Mac Macs ใช้ HFS + ( Hierarchical File System Plus ) ซึ่งเป็นระบบไฟล์ที่ทันสมัยที่มีข้อ จำกัด แต่เฉพาะในสถานการณ์ที่รุนแรง

จากประสบการณ์ของฉันมันเป็นเหมือนระบบไฟล์ journaling Linux EXT สนับสนุนการติดตั้งไดเรกทอรี UNIX เหมือนสิทธิ์ ฯลฯ มันจ่าหน้าไฟล์ในรูปแบบ 32 บิตทำให้จำนวนสูงสุดของไฟล์ที่สามารถเก็บไว้ในปริมาณ 4294967295 ตามนี้แหล่งที่มา

ระบบแฟ้มเริ่มต้นที่จะทำลายกับไฟล์ที่มีขนาดใหญ่กว่า 8 EB บนระบบที่ทันสมัยและถึง 2100000000 ไฟล์และโฟลเดอร์ในสถานที่หนึ่งตามที่ระบุไว้ที่นี่

ด้วยวิธีการที่ HFS + หรือจริงๆแล้วระบบไฟล์ใด ๆ ได้รับการตั้งค่าสำหรับเรื่องนั้น - การมีไฟล์จำนวนมากในโฟลเดอร์ไม่ควรทำสิ่ง 'แปลก'

สุจริตฉันไม่คิดว่าจะมีการปรับปรุงประสิทธิภาพการกระจายไฟล์ข้ามลำดับชั้นของโฟลเดอร์ที่ซับซ้อนมากขึ้น ที่จริงแล้วเทคนิคนี้อาจมีประสิทธิภาพน้อยกว่าเพราะสคริปต์ของคุณจะต้องโทรไปเปลี่ยนไดเรกทอรีกลางกระบวนการ


ขวา. ฉันคิดเกี่ยวกับการเปลี่ยนลำดับชั้นไดเรกทอรี แต่มันทำให้อัลกอริทึมที่ซับซ้อนมากขึ้นและฉันสงสัยว่าจะมีการปรับปรุงประสิทธิภาพมากขึ้น ขอบคุณสำหรับคำตอบ. ปัจจุบันฉันมี 200,000 ไฟล์ในไดเรกทอรีและอาจมี 1,000,000 ในตอนท้าย ฉันหวังว่ามันจะทำงานได้ดีโดยไม่มีประสิทธิภาพที่แย่
Daisuki Honey

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

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