การวางไฟล์จำนวนมาก (10 ล้าน) ในโฟลเดอร์เดียว


17

ฉันเพิ่งเพิ่มคุณสมบัติการค้นหาแบบคาดการณ์ (ดูตัวอย่างด้านล่าง) ในเว็บไซต์ของฉันที่ทำงานบนเซิร์ฟเวอร์ Ubuntu สิ่งนี้รันโดยตรงจากฐานข้อมูล ฉันต้องการแคชผลลัพธ์สำหรับการค้นหาแต่ละครั้งและใช้หากมีอยู่ให้สร้างขึ้นใหม่

จะมีปัญหาใด ๆ กับฉันหรือไม่ที่จะบันทึกผลการใช้งาน 10 ล้าน cira ในไฟล์แยกกันในไดเรกทอรีเดียว หรือแนะนำให้แบ่งไฟล์ออกเป็นโฟลเดอร์หรือไม่?

ตัวอย่าง:


5
มันจะเป็นการดีกว่าที่จะแยก คำสั่งใด ๆ ที่พยายามที่จะแสดงรายการเนื้อหาของไดเรกทอรีนั้นมีแนวโน้มที่จะตัดสินใจยิงตัวเอง
muru

8
ดังนั้นถ้าคุณมีฐานข้อมูลอยู่แล้วทำไมไม่ลองใช้มันล่ะ ฉันแน่ใจว่า DBMS จะสามารถจัดการบันทึกได้มากกว่าล้านรายการกับระบบไฟล์ หากคุณตายโดยใช้ระบบไฟล์คุณจะต้องใช้รูปแบบการแยกโดยใช้แฮชบางประเภท ณ จุดนี้ IMHO ดูเหมือนว่าการใช้ DB จะทำงานได้น้อยลง
roadmr

3
ตัวเลือกอื่นสำหรับการแคชที่เหมาะกับแบบจำลองของคุณดีกว่าอาจเป็น memcached หรือ redis พวกเขาเป็นร้านค้าที่มีค่าคีย์ (ดังนั้นพวกเขาจึงทำหน้าที่เหมือนไดเรกทอรีเดียวและคุณเข้าถึงรายการโดยใช้ชื่อ) Redis เป็นแบบถาวร (จะไม่สูญเสียข้อมูลเมื่อมีการรีสตาร์ท) โดยที่ memcached ใช้สำหรับรายการชั่วคราวเพิ่มเติม
Stephen Ostermiller

2
มีปัญหาไก่และไข่ที่นี่ นักพัฒนาเครื่องมือไม่จัดการไดเรกทอรีที่มีไฟล์จำนวนมากเพราะคนไม่ทำเช่นนั้น และผู้คนไม่สร้างไดเรกทอรีที่มีไฟล์จำนวนมากเพราะเครื่องมือไม่รองรับอย่างดี เช่นฉันเข้าใจในครั้งเดียว (และฉันเชื่อว่าสิ่งนี้ยังคงเป็นจริง) การร้องขอคุณสมบัติเพื่อสร้างตัวสร้างเวอร์ชันของos.listdirในไพ ธ อนถูกปฏิเสธอย่างไม่ราบรื่นด้วยเหตุผลนี้

จากประสบการณ์ของฉันเองฉันเคยเห็นความเสียหายเมื่อไปเกิน 32k ไฟล์ในไดเรกทอรีเดียวบน Linux 2.6 เป็นไปได้ที่จะปรับแต่งนอกเหนือจากจุดนี้แน่นอน แต่ฉันไม่อยากจะแนะนำ เพียงแค่แบ่งออกเป็นไม่กี่เลเยอร์ของไดเรกทอรีย่อยและมันจะดีขึ้นมาก โดยส่วนตัวฉันจะ จำกัด ไว้ที่ประมาณ 10,000 ต่อไดเรกทอรีซึ่งจะให้คุณ 2 เลเยอร์
Wolph

คำตอบ:


25

จะมีปัญหาใด ๆ กับฉันหรือไม่ที่จะบันทึกผลลัพธ์ประมาณ 10 ล้านรายการในไฟล์แยกกันในไดเรกทอรีเดียว

ใช่. อาจมีเหตุผลมากกว่านี้ แต่สิ่งเหล่านี้ฉันสามารถโพสต์จากด้านบนของหัวของฉัน:

  • tune2fsมีตัวเลือกที่เรียกdir_indexว่ามีแนวโน้มที่จะเปิดใช้งานตามค่าเริ่มต้น (บน Ubuntu คือ) ที่ให้คุณจัดเก็บไฟล์ประมาณ 100k ในไดเรกทอรีก่อนที่คุณจะเห็นประสิทธิภาพ ที่ไม่ได้อยู่ใกล้กับไฟล์ 10m ที่คุณกำลังคิด

  • extระบบไฟล์มีจำนวนไอโหนดสูงสุดคงที่ ทุกไฟล์และไดเรกทอรีใช้ 1 ไอโหนด ใช้df -iสำหรับมุมมองของพาร์ติชันและ inodes ของคุณฟรี เมื่อคุณใช้ไอโหนดหมดคุณจะไม่สามารถสร้างไฟล์หรือโฟลเดอร์ใหม่ได้

  • คำสั่งเช่นrmและlsเมื่อใช้สัญลักษณ์ตัวแทนขยายคำสั่งและจะลงท้ายด้วย "รายการอาร์กิวเมนต์ยาวเกินไป" คุณจะต้องใช้findเพื่อลบหรือแสดงรายการไฟล์ และfindมีแนวโน้มที่จะช้า

หรือแนะนำให้แบ่งไฟล์ออกเป็นโฟลเดอร์หรือไม่?

ใช่. แน่นอนที่สุด โดยทั่วไปคุณไม่สามารถแม้แต่จะเก็บไฟล์ 10m ใน 1 ไดเรกทอรี

ฉันจะใช้ฐานข้อมูล หากคุณต้องการแคชสำหรับเว็บไซต์ให้ดูที่ " solr " ("ให้การจัดทำดัชนีแบบกระจายการจำลองแบบและการสอบถามการโหลดบาลานซ์")


8

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

เกณฑ์มาตรฐาน

Ref: https://medium.com/@hartator/benchmark-deep-directory-structure-vs-flat-directory-structure-to-store-millions-of-files-on-ext4-cac1000ca28


1
ขอบคุณสิ่งนี้มีประโยชน์มาก ฉันใช้สิ่งนี้ในเว็บไซต์และเป็นปัญหาที่แท้จริงในการตั้งโปรแกรมส่วนนี้ใหม่เพื่อให้มี /abc/efg.html โครงสร้างไดเรกทอรี ดังนั้นฉันจะย้ายกลับไปยังไดเรกทอรีแฟลตในอนาคต
Kohjah Breese

0

การค้นหาแบบไบนารีสามารถจัดการกับบันทึกนับล้านได้อย่างง่ายดายดังนั้นการค้นหาไดเรกทอรีเดียวจะไม่เป็นปัญหา มันจะทำเร็วมาก

โดยทั่วไปถ้าคุณใช้ระบบ 32 บิตการค้นหาแบบไบนารี่สูงสุดไม่เกิน 2Gb นั้นง่ายและดี

Berekely DB ซึ่งเป็นซอฟต์แวร์โอเพนซอร์ซจะช่วยให้คุณสามารถจัดเก็บผลการทดสอบอย่างเต็มรูปแบบภายใต้รายการเดียวและจะมีการค้นหาในตัว

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