[linux-l] Re: Wohin mit den alten Mails? datenbank? dbm?

Rocco Rutte pdmef at cs.tu-berlin.de
Di Mär 20 15:29:19 CET 2007


Hi,

* Oliver Bandel [07-03-20 12:47:23 +0100] wrote:
>On Tue, Mar 20, 2007 at 09:44:22AM +0000, Rocco Rutte wrote:

>> Die Erfahrung bei mutt zeigt, dass eine "Datenbank" (also nur eine 
>> Binärdatei, das hat mit Datenbanken im eigentlichen Sinne nichts zu tun) 
>> um Größenordnungen schneller ist als eine für alle. Die "Datenbank" hat 
>> dann nämlich um Größenordnungen weniger Keys und die Suche geht viel 
>> schneller.
>[...]

>Kannst Du das mal etwas näher erläutern?

Sicher.

>Was ist schneller als was?

Eine "Datenbank" pro Folder ist schneller als eine Datenbank für alle 
Folder.

>Und was für eine Art Binärdatei wird da gebracuth?

Das hängt davon ab. Eigentlich werden die gängigen DB-Manager (gdbm, 
qdbm, Berkeley DB) unterstützt und genutzt, um Key-Value-Paare zu 
speichern. Die Binärdatei ist die "Datenbank".

(Alles in Anführungszeichen, weil es mit Datenbanken wie postgresql 
nichts zu tun hat, es gibt Datenbank-technisch also kein Locking, keine 
Transaktionen, etc; zumindest nutzt mutt sie nicht).

>Was steht da drin? Wie ist der Aufbau?

Da wird als Key nur "Folder/Message-ID" benutzt, wobei Message-ID nicht 
die aus dem Header ist sondern je nach Folder was anderes ist. Nummern 
kriegt man via IMAP, einen Hexstring von POP, der Teil des Dateinamens 
in Maildir ohne Flags oder die Sequenznummer bei MH. Also irgendwas, was 
die Nachricht pro Odner eindeutig identifiziert. Ordner davor und es ist 
eineindeutig.

Als Value werden im Prinzip die mutt-Strukturen via memcpy() und einem 
put() (ganz grob) benutzt. D.h. beim Laden hat man schon alles in den 
Strukturen und muss nicht noch groß zusammenbauen sondern nur ein paar 
Pointer zuweisen.

Das ganze ist relativ schnell und eigentlich kaum spürbar (naja, etwas 
Zeit dauert es eben auch >10k Mails zu lesen). Man sollte allerdings bei 
großen Foldern $read_inc so auf 1000 setzen (mit $read_inc gibt man an, 
aller wieviel Messages der Fortschritt angezeigt wird). Ein gängiger 
Fehler ist den Default von 10 zu lassen. Da braucht die Maschine mehr 
CPU-Zeit zum Anzeigen des Fortschritts als für die eigentliche Arbeit. 
Steht aber auch im Manual... :)

(Das ist derzeit immmer noch etwas "kaputt", weil man nur neu anlegen 
kann aber nicht vorhandene Sätze aktualisieren. Es werden Pointer 
mitgespeichert, die hinterher natürlich eine andere Addresse haben bzw.  
von denen die Daten nicht geschrieben/gelesen wurden. Ein Fix ist nicht 
trivial, weil der Kontrollfluss etwas, uhm, kompliziert ist.)

Der genaue Aufbau hängt vom DB-Manager ab, der benutzt wird. qdbm kann 
glaube ich B+-Bäume und Hashtabellen, was aber in dem speziellen Fall 
jetzt benutzt wird, und gdbm/bdb... siehe Source... :)

   bye, Rocco
-- 
:wq!



Mehr Informationen über die Mailingliste linux-l