ฐานข้อมูลใดที่ `อัพเดต 'และการค้นหา` ใช้'?


25

locateโปรแกรมfindutilsสแกนหนึ่งหรือฐานข้อมูลอื่น ๆ จากชื่อไฟล์และการแสดงการแข่งขันใด ๆ ซึ่งสามารถใช้เป็นfindคำสั่งที่รวดเร็วมากหากไฟล์นั้นมีอยู่ในระหว่างการอัพเดทฐานข้อมูลชื่อไฟล์ล่าสุด

ปัจจุบันมีฐานข้อมูลหลายประเภท

ดังนั้นฐานข้อมูลชนิดใดที่updatedbปรับปรุงและlocateใช้งาน?

ขอบคุณ


ไม่ว่าการระบุตำแหน่งจะใช้ BerkelyDB จริงหรือไม่คุณควรตรวจสอบว่าเป็นที่เก็บคีย์ - ค่าที่อิงกับดิสก์ที่เก่าและเรียบง่ายและมีประสิทธิภาพมากหรือไม่
pjc50

@ pjc50 ฉันชอบที่จะ ไฟล์สำหรับฐานข้อมูลอยู่ที่ไหน ฉันจะดูเนื้อหาของพวกเขาได้อย่างไร?
ทิม

เพื่อค้นหา? serverfault.com/questions/454127/…
pjc50

"ไม่พบหน้าเว็บ" ลิงก์ควรเป็นserverfault.com/questions/454127/…
ทิม

ดังนั้น "คีย์" และ "ค่า" หมายถึงอะไรในฐานข้อมูล? ถ้าฉันเข้าใจความคิดเห็นของ Stephen Kitt unix.stackexchange.com/questions/379725/ …ถูกต้องแสดงว่าฐานข้อมูลไม่ใช่คีย์ - ค่า
ทิม

คำตอบ:


29

การนำไปใช้งานของlocate/ updatedbมักจะใช้ฐานข้อมูลเฉพาะที่ปรับให้เหมาะกับความต้องการของพวกเขาไม่ใช่เอนจิ้นฐานข้อมูลทั่วไป คุณจะพบฐานข้อมูลเฉพาะที่บันทึกไว้โดยการติดตั้งแต่ละครั้ง ตัวอย่างเช่น:

  • GNU findutils'มีการบันทึกไว้ในlocatedb(5)และเป็นเพียงรายชื่อไฟล์ (พร้อมอัลกอริทึมการบีบอัดเฉพาะ);
  • mlocateมีการบันทึกไว้ในmlocate.db(5)และยังสามารถพิจารณารายการไดเรกทอรีและไฟล์ (พร้อมเมทาดาทา)

ขอบคุณ ฉันจะเรียนรู้หลักการของการออกแบบและการใช้ฐานข้อมูลเฉพาะได้ที่ไหนและอย่างไร ฉันขอขอบคุณอ้างอิงใด ๆ สำหรับการอ่าน
ทิม

11
การออกแบบฐานข้อมูลจะลดลงไปจนถึงการออกแบบโครงสร้างข้อมูลดังนั้นเรียนรู้เกี่ยวกับสิ่งเหล่านั้นและจากนั้นการออกแบบขนาดเทียบกับความเร็ว ... ฉันไม่รู้ทรัพยากรเฉพาะที่จะดีบางทีการเขียนโปรแกรม Pearlอาจจะเป็น เป็นการแนะนำที่ดีเกี่ยวกับวิธีคิดเกี่ยวกับหัวข้อเหล่านี้ (และไม่คิดมากเกินไป)
Stephen Kitt

ขอบคุณ ฉันได้เรียนรู้บางอย่างเกี่ยวกับโครงสร้างข้อมูลและคำถามต่อไปคือการค้นหาการอ้างอิงและวิธีการจากโครงสร้างข้อมูลไปยังฐานข้อมูล
ทิม

2
ฐานข้อมูลที่ใช้โดยlocateเป็นเพียงโครงสร้างข้อมูลที่เก็บไว้ในดิสก์ดังนั้นการย้ายจากโครงสร้างข้อมูลไปยังฐานข้อมูลที่เกี่ยวข้องนั้นค่อนข้างตรงไปตรงมา การย้ายไปยังฐานข้อมูลเนื่องจากคำถามของคุณเป็นอีกเรื่องหนึ่ง มีหนังสือและหลักสูตรที่อุทิศให้กับหัวข้อเหล่านั้น การออกแบบและพัฒนาระบบการจัดการฐานข้อมูลเช่น MongoDB หรือ PostgreSQL เป็นหนึ่งในปัญหาที่ยากขึ้นในด้านวิทยาการคอมพิวเตอร์และวิศวกรรมซอฟต์แวร์ในปัจจุบันโดยเฉพาะอย่างยิ่งเมื่อคุณเข้าร่วมในหลาย ๆ ด้าน
Stephen Kitt

2
ฉันทำค่อนข้างยุติธรรมกับ locatedb & mlocate.db ในช่วงหลายปีที่ผ่านมา เดิมฉันมีรหัส Perl เพื่อสร้างที่อยู่สำหรับdlocateโปรแกรมของฉันในเดเบียน ฉันพบว่าการ grepping ไฟล์ข้อความนั้นเร็วกว่าการค้นหาที่อยู่หลายครั้งและทำให้ขนาดของดิสก์ในทุกวันนี้การประหยัดขนาดไฟล์ไม่มีนัยสำคัญ ดังนั้นฉันจึงเปลี่ยนเป็น grep ฉันยังมีงาน cron แบบโลคัลที่ทิ้ง mlocate.db ไปเป็นข้อความธรรมดาหลังจากงาน mlocate cron รันซึ่งฉันค้นหาด้วยqlocateเชลล์สคริปต์แบบโลคอล .... เร็วกว่าการรันmlocateและมีตัวเลือกพิเศษที่มีประโยชน์บางอย่าง
cas

13

ดูเหมือนว่าจะเป็นไฟล์ flat ของ C structs เขียน / อ่านโดยใช้ Gnu LibC OBSTACKS Macros

ดูแหล่งที่มา

https://github.com/msekletar/mlocate/blob/master/src/updatedb.c#L720

https://github.com/msekletar/mlocate/blob/master/src/locate.c#L413

คุณสามารถได้รับสิ่งที่คล้ายกับ

find / -xdev -type f -not -path \*\.git\/\* | gzip -9 > /tmp/files.gz
zgrep file_i_want /tmp/files.gz

2
ขอบคุณ ในตอนท้ายทั้งสองคำสั่งทำอะไร?
ทิม

2
คำสั่ง @Tim First กำลังค้นหาไดเร็กทอรีfilesystem ( find) จาก root ( /) โดยไม่ต้องลงไปยังไดเร็กทอรีบน filesystems อื่น ( -xdev), ไฟล์ปกติ ( -type f), ไม่ใช่ใน*.gitไดเร็กทอรี ( -not -path \*\.git\/\*) มันบีบอัดเอาต์พุต ( | gzip -9) และบันทึกลงในไฟล์/tmp/files.gz( > /tmp/files.gz) บรรทัดถัดไปกำลังค้นหาด้วยzgrepไฟล์file_i_wantภายในไฟล์บีบอัด/tmp/files.gz
piotrekkr

2

เท่าที่ฉันรู้อยู่ข้างหลังคือBerkeley DBซึ่งเป็นฐานข้อมูลคีย์ / ค่า daemonless ตามลิงค์สำหรับข้อมูลเพิ่มเติม สารสกัดจาก Wikipedia:

Berkeley DB (BDB) เป็นไลบรารีซอฟต์แวร์ที่มีวัตถุประสงค์เพื่อจัดเตรียมฐานข้อมูลแบบฝังที่มีประสิทธิภาพสูงสำหรับข้อมูลคีย์ / ค่า Berkeley DB เขียนด้วย C พร้อมการเชื่อม API สำหรับ C ++, C #, Java, Perl, PHP, Python, Ruby, Smalltalk, Tcl และภาษาการเขียนโปรแกรมอื่น ๆ อีกมากมาย BDB เก็บคู่ของคีย์ / ข้อมูลตามอำเภอใจเป็นอาร์เรย์ไบต์และสนับสนุนรายการข้อมูลหลายรายการสำหรับคีย์เดียว Berkeley DB ไม่ใช่ฐานข้อมูลเชิงสัมพันธ์

ตำแหน่งของฐานข้อมูลใน RHEL / CentOS คือ/var/lib/mlocate/mlocate.db(ไม่แน่ใจเกี่ยวกับการแจกแจงอื่น ๆ ) คำสั่งlocate --statisticsจะให้ข้อมูลเกี่ยวกับสถานที่และสถิติของฐานข้อมูล (ตัวอย่าง):

Database /var/lib/mlocate/mlocate.db:
        16,375 directories
        242,457 files
        11,280,301 bytes in file names
        4,526,116 bytes used to store database

สำหรับรูปแบบ mlocate ที่นี่เป็นหัวหน้าคน:

ฐานข้อมูล mlocate เริ่มต้นด้วยส่วนหัวของไฟล์: 8 ไบต์สำหรับหมายเลขเวทย์มนตร์ ("\ 0mlo - cate" เช่นตัวอักษร C), 4 ไบต์สำหรับขนาดบล็อกการกำหนดค่าใน endian ใหญ่ 1 ไบต์สำหรับเวอร์ชันรูปแบบไฟล์ (0), 1 ไบต์สำหรับแฟล็ก“ ต้องการการมองเห็น” (0 หรือ 1), ช่องว่างภายใน 2 ไบต์และชื่อพา ธ ที่ยกเลิกด้วย NUL ของรูทของฐานข้อมูล

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


2
ขึ้นอยู่กับการดำเนินการตามlocate/ updatedb...
สตีเฟ่น Kitt

2
mlocateแน่นอนที่สุดไม่ได้ใช้ Berkeley DB
Stephen Kitt

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