[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