Che tipo di database usano `UpdatedB` e` Locate`?


25

Il locateprogramma findutilsesegue la scansione di uno o più database di nomi di file e visualizza eventuali corrispondenze. Questo può essere usato come findcomando molto veloce se il file era presente durante l'ultimo aggiornamento del database dei nomi file.

Ci sono molti tipi di database al giorno d'oggi,

Quindi che tipo di database updatedbaggiorna e locateusa?

Grazie.


Indipendentemente dal fatto che Locate utilizzi effettivamente BerkelyDB, vale la pena indagare: è un archivio di valori-chiave basato su disco molto vecchio, semplice ed efficace.
pjc50,

@ pjc50 Mi piacerebbe molto. Dove sono i file per il database? Come devo visualizzare i loro contenuti?
Tim


"Pagina non trovata", il collegamento dovrebbe essere serverfault.com/questions/454127/…
Tim

Cosa rappresentano "chiavi" e "valori" nel database? Se capisco correttamente il commento di Stephen Kitt unix.stackexchange.com/questions/379725/… , il database non è un valore-chiave.
Tim

Risposte:


29

Le implementazioni di locate/ updatedbtipicamente utilizzano database specifici su misura per i loro requisiti, piuttosto che un motore di database generico. Troverai quei database specifici documentati da ogni implementazione; per esempio:

  • GNU findutils'è documentato locatedb(5)ed è praticamente solo un elenco di file (con un algoritmo di compressione specifico);
  • mlocate's è documentato mlocate.db(5)e può anche essere considerato un elenco di directory e file (con metadati).

Grazie. Dove e come posso apprendere i principi di progettazione e implementazione di database specifici adattati a requisiti specifici? Gradirei qualsiasi riferimento per la lettura.
Tim

11
La progettazione di database si riduce alla progettazione di strutture di dati, quindi informati su quelli e quindi sui compromessi di progettazione dimensioni-contro-velocità ... Non conosco una risorsa specifica che sarebbe buona, forse qualcosa come la programmazione Pearls sarebbe una bella introduzione al modo di pensare a questi argomenti (e non a pensarci troppo).
Stephen Kitt,

Grazie. Ho imparato qualcosa sulle strutture di dati e la domanda successiva sarebbe trovare riferimenti e modi per passare dalle strutture di dati ai database.
Tim

2
I database utilizzati da locatesono solo strutture di dati archiviate su disco, quindi passare dalle strutture di dati ai database corrispondenti è relativamente semplice. Passare ai database quando la tua domanda li presenta è un'altra cosa; ci sono libri e corsi dedicati a questi argomenti. Progettare e sviluppare un sistema di gestione di database come MongoDB o PostgreSQL è oggi uno dei problemi più difficili nell'informatica e nell'ingegneria del software, specialmente quando si getta il lato distribuito delle cose.
Stephen Kitt,

2
ho fatto un bel po 'di localizzazione e mlocate.db nel corso degli anni. Inizialmente avevo il codice perl per generare un locationb per il mio dlocateprogramma in debian. Alla fine ho scoperto che il semplice grepping di un file di testo era molte volte più veloce della ricerca di un foundb, e data la dimensione dei dischi in questi giorni i risparmi sulla dimensione del file erano insignificanti. Quindi sono passato a grep. Ho anche un lavoro cron locale che scarica mlocate.db in testo normale dopo l'esecuzione del lavoro cron mlocate, che cerco con uno qlocatescript di shell locale ... molto più veloce di quello in esecuzione mlocatee ha anche alcune utili opzioni extra.
Cas

13

Sembra essere un file flat di strutture C, scritto / letto usando le macro Gnu LibC OBSTACKS

Vedi fonti

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

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

Potresti ottenere qualcosa di simile con

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

2
Grazie. Cosa stanno facendo i due comandi alla fine?
Tim

2
@Tim Il primo comando è la ricerca di filesystem ( find) dalla /directory root ( ), senza scendere in directory su altri filesystem ( -xdev), file regolari ( -type f), non in *.gitdirectory ( -not -path \*\.git\/\*). Comprime output ( | gzip -9) e lo salva in file /tmp/files.gz( > /tmp/files.gz). La riga successiva sta cercando il zgrepfile file_i_wantall'interno del file compresso/tmp/files.gz
piotrekkr,

2

Per quanto ne so dietro c'è Berkeley DB che è un database daemonless chiave / valore. Segui il link per maggiori informazioni. Estratto da Wikipedia:

Berkeley DB (BDB) è una libreria software destinata a fornire un database incorporato ad alte prestazioni per dati chiave / valore. Berkeley DB è scritto in C con collegamenti API per C ++, C #, Java, Perl, PHP, Python, Ruby, Smalltalk, Tcl e molti altri linguaggi di programmazione. BDB archivia coppie chiave / dati arbitrarie come array di byte e supporta più elementi di dati per una singola chiave. Berkeley DB non è un database relazionale.

La posizione del database in RHEL / CentOS è /var/lib/mlocate/mlocate.db(non sono sicuro delle altre distribuzioni). Il comando locate --statisticsti darà informazioni sulla posizione e alcune statistiche del database (esempio):

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

Per il formato mlocate ecco la testa della pagina man:

Un database mlocate inizia con un'intestazione di file: 8 byte per un numero magico ("\ 0milated" come un letterale C), 4 byte per la dimensione del blocco di configurazione in big endian, 1 byte per la versione del formato file (0), 1 byte per il flag "richiedi visibilità" (0 o 1), riempimento di 2 byte e un nome percorso con terminazione NUL della radice del database.

L'intestazione è seguita da un blocco di configurazione, incluso per garantire che i database non vengano riutilizzati se alcune modifiche alla configurazione potrebbero influire sul loro contenuto. La dimensione del blocco di configurazione in byte è memorizzata nell'intestazione del file. Il blocco di configurazione è una sequenza di assegnazioni di variabili, ordinate per nome di variabile. Ogni assegnazione variabile è costituita da un nome di variabile terminato NUL e da un elenco ordinato di valori terminati NUL. L'elenco dei valori viene terminato da un altro carattere NUL. L'ordinamento utilizzato è definito dalla funzione strcmp ().


2
Dipende dall'attuazione di locate/ updatedb...
Stephen Kitt il

2
mlocatesicuramente non usa Berkeley DB.
Stephen Kitt,

1
Hai qualche fonte a sostegno del tuo reclamo BerkeleyDB? La seconda parte della tua risposta la contraddice.
Mat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.