Basis data apa yang digunakan `updatedb` dan` loc`?

25

The locateprogram findutilsscan satu atau lebih database dari nama file dan menampilkan setiap pertandingan. Ini dapat digunakan sebagai findperintah yang sangat cepat jika file itu ada selama pembaruan database nama file terakhir.

Ada banyak jenis database saat ini,

Jadi, basis data apa yang updatedbdiperbarui dan locatedigunakan?

Terima kasih.

Tim
sumber
Terlepas dari apakah lokasi benar-benar menggunakan BerkelyDB, ada baiknya Anda selidiki - ini adalah penyimpanan nilai kunci berbasis disk yang sangat tua, sederhana, dan efektif.
pjc50
@ pjc50 Saya ingin sekali. Di mana file-file untuk basis data? Bagaimana saya melihat isinya?
Tim
"Halaman Tidak Ditemukan", tautannya harus serverfault.com/questions/454127/…
Tim
Jadi apa yang mewakili "kunci" dan "nilai" dalam database? Jika saya memahami komentar Stephen Kitt unix.stackexchange.com/questions/379725/… dengan benar, database bukanlah nilai kunci.
Tim

Jawaban:

29

Implementasi dari locate/ updatedbbiasanya menggunakan database spesifik yang disesuaikan dengan kebutuhan mereka, daripada mesin database generik. Anda akan menemukan database spesifik yang didokumentasikan oleh setiap implementasi; sebagai contoh:

  • GNU findutils'didokumentasikan locatedb(5), dan cukup banyak hanya daftar file (dengan algoritma kompresi tertentu);
  • mlocateDidokumentasikan dalam mlocate.db(5), dan juga dapat dianggap sebagai daftar direktori dan file (dengan metadata).
Stephen Kitt
sumber
Terima kasih. Di mana dan bagaimana saya bisa mempelajari prinsip-prinsip merancang dan mengimplementasikan basis data spesifik yang disesuaikan dengan persyaratan spesifik? Saya menghargai referensi untuk membaca.
Tim
11
Mendesain basis data bermuara pada perancangan struktur data, jadi pelajari tentang itu, dan kemudian tentang pertukaran desain ukuran-versus-kecepatan ... Saya tidak tahu sumber daya tertentu yang akan bagus, mungkin sesuatu seperti Pemrograman Mutiara mungkin pengantar yang bagus untuk cara berpikir tentang topik ini (dan tidak terlalu memikirkannya juga).
Stephen Kitt
Terima kasih. Saya telah belajar sesuatu tentang struktur data, dan pertanyaan berikutnya adalah menemukan referensi dan cara untuk beralih dari struktur data ke database.
Tim
2
Database seperti yang digunakan oleh locatehanya struktur data yang disimpan di disk, jadi pergi dari struktur data ke database yang sesuai relatif mudah. Pindah ke basis data saat pertanyaan Anda disajikan adalah hal yang sama sekali berbeda; ada buku dan kursus yang didedikasikan untuk topik-topik itu. Merancang dan mengembangkan sistem manajemen basis data seperti MongoDB atau PostgreSQL adalah salah satu masalah yang lebih sulit dalam ilmu komputer dan rekayasa perangkat lunak saat ini, terutama ketika Anda melempar sisi terdistribusi.
Stephen Kitt
2
Saya telah melakukan sedikit yang adil dengan locatedb & mlocate.db selama bertahun-tahun. Saya awalnya punya kode perl untuk menghasilkan locatedb untuk dlocateprogram saya di debian. Saya akhirnya menemukan bahwa hanya mengambil file teks berkali-kali lebih cepat daripada mencari locatedb, dan mengingat ukuran disk hari ini penghematan ukuran file tidak signifikan. Jadi saya beralih ke hanya grep. Saya juga memiliki pekerjaan cron lokal yang membuang mlocate.db ke teks biasa setelah pekerjaan mlocate cron berjalan, yang saya cari dengan qlocateskrip shell lokal .... jauh lebih cepat daripada menjalankan mlocatedan juga memiliki beberapa opsi tambahan yang berguna.
cas
13

Tampaknya merupakan file flat dari C struct, ditulis / dibaca menggunakan Gnu LibC OBSTACKS Macro

Lihat sumber

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

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

Anda bisa mendapatkan sesuatu yang serupa

find / -xdev -type f -not -path \*\.git\/\* | gzip -9 > /tmp/files.gz
zgrep file_i_want /tmp/files.gz
selamat tinggal
sumber
2
Terima kasih. Apa yang dua perintah pada akhirnya lakukan?
Tim
2
@Tim Perintah pertama adalah mencari filesystem ( find) dari direktori root ( /), tanpa turun ke direktori di filesystem lain ( -xdev), file biasa ( -type f), bukan di *.gitdirektori ( -not -path \*\.git\/\*). Ini mengkompresi output ( | gzip -9) dan menyimpannya ke file /tmp/files.gz( > /tmp/files.gz). Baris berikutnya sedang mencari zgrepfile file_i_wantdi dalam file terkompresi/tmp/files.gz
piotrekkr
2

Sejauh yang saya tahu di belakang adalah Berkeley DB yang merupakan basis data kunci / nilai daemonless. Ikuti tautan untuk info lebih lanjut. Ekstrak dari Wikipedia:

Berkeley DB (BDB) adalah pustaka perangkat lunak yang dimaksudkan untuk menyediakan database tertanam berkinerja tinggi untuk data kunci / nilai. Berkeley DB ditulis dalam C dengan binding API untuk C ++, C #, Java, Perl, PHP, Python, Ruby, Smalltalk, Tcl, dan banyak bahasa pemrograman lainnya. BDB menyimpan pasangan kunci / data yang sewenang-wenang sebagai array byte, dan mendukung banyak item data untuk satu kunci. Berkeley DB bukan merupakan basis data relasional.

Lokasi basis data di RHEL / CentOS adalah /var/lib/mlocate/mlocate.db(tidak yakin tentang distribusi lainnya). Perintah ini locate --statisticsakan memberi Anda info tentang lokasi dan beberapa statistik basis data (contoh):

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

Untuk format mlocate di sini adalah kepala halaman manual:

Basis data mlocate dimulai dengan header file: 8 byte untuk angka ajaib ("\ 0mengganti" seperti literal C), 4 byte untuk ukuran blok konfigurasi di big endian, 1 byte untuk versi format file (0), 1 byte untuk bendera “memerlukan visibilitas” (0 atau 1), 2 byte padding, dan nama jalur yang diakhiri NUL dari root database.

Header diikuti oleh blok konfigurasi, termasuk untuk memastikan database tidak digunakan kembali jika beberapa perubahan konfigurasi dapat memengaruhi kontennya. Ukuran blok konfigurasi dalam byte disimpan di header file. Blok konfigurasi adalah urutan penugasan variabel, diurutkan berdasarkan nama variabel. Setiap penugasan yang bervariasi terdiri dari nama variabel yang diakhiri NUL dan daftar yang terurut dari nilai yang diakhiri NUL. Daftar nilai diakhiri oleh satu lagi karakter NUL. Urutan yang digunakan ditentukan oleh fungsi strcmp ().

Romeo Ninov
sumber
2
Hal ini tergantung pada pelaksanaan locate/ updatedb...
Stephen Kitt
2
mlocatepasti tidak menggunakan Berkeley DB.
Stephen Kitt
1
Apakah Anda memiliki sumber yang mendukung klaim BerkeleyDB Anda? Bagian kedua dari jawaban Anda bertentangan dengannya.
Mat