mailbox.Maildir und neue Mails

30/11/2010 - 23:15 von Tobias Klausmann | Report spam
Moin,

ich benutze mailbox.Maildir, um eine Liste neuer Mails in
diversen Mailboxen zu generieren und anzuzeigen. Das Problem ist
nun, dass einige dieser Maildirs 20+k alte Mails enthalten,
was das Ganze nicht gerade schneller werden làsst: etwa 3000
Mails/s auf Neuigkeit zu überprüfen (mit msg.get_subdir()=="new")
ist so ziemlich das Maximum auf meiner durchaus modernen Hardware.

Das Problem ist, dass mailbox.Maildir _alle_ Mails liefert, also
wirklich 20k Mails liest, da ich über sie iteriere. Mich
interessieren aber nur die neuen (Achtung: nicht das
Maildir-Attribut "unseen") Mails, ergo könnte das Modul
_eigentlich_ sich nur das Unterverzeichnis new/ ansehen und wàre
viel schneller fertig - denn da sind nie mehr als ein paar
Dutzend Mails drin.

Die Frage ist, wie sag ichs meinem Kinde^W^Wdem Modul? Ich habe
die Vermutung, dass man mit der Maildir übergebbaren factory für
Message-Objekte etwas anstellen könnte, das erscheint mir aber
aufwendig. Bevor ich das tue: Bessere Ideen?

Gruss,
Tobias





Sent from aboard the Culture ship
ROU (Gangster Class) Shoot Them Later (Eccentric, Ulterior)
 

Lesen sie die antworten

#1 Peter Otten
01/12/2010 - 19:38 | Warnen spam
Tobias Klausmann wrote:

ich benutze mailbox.Maildir, um eine Liste neuer Mails in
diversen Mailboxen zu generieren und anzuzeigen. Das Problem ist
nun, dass einige dieser Maildirs 20+k alte Mails enthalten,
was das Ganze nicht gerade schneller werden làsst: etwa 3000
Mails/s auf Neuigkeit zu überprüfen (mit msg.get_subdir()=="new")
ist so ziemlich das Maximum auf meiner durchaus modernen Hardware.

Das Problem ist, dass mailbox.Maildir _alle_ Mails liefert, also
wirklich 20k Mails liest, da ich über sie iteriere. Mich
interessieren aber nur die neuen (Achtung: nicht das
Maildir-Attribut "unseen") Mails, ergo könnte das Modul
_eigentlich_ sich nur das Unterverzeichnis new/ ansehen und wàre
viel schneller fertig - denn da sind nie mehr als ein paar
Dutzend Mails drin.

Die Frage ist, wie sag ichs meinem Kinde^W^Wdem Modul? Ich habe
die Vermutung, dass man mit der Maildir übergebbaren factory für
Message-Objekte etwas anstellen könnte, das erscheint mir aber
aufwendig. Bevor ich das tue: Bessere Ideen?



Ziemlich ruhig hier ;)

Ohne mich groß um ein Verstàndnis der Maildir-Klasse zu bemühen würd ich
auf's Geratewohl mal die _refresh()-Methode wie folgt modifizieren:


class OnlyNewMaildir(mailbox.Maildir):
def _refresh(self):
"""Update table of contents mapping."""
self._toc = {}
for subdir in ('new', ):
subdir_path = os.path.join(self._path, subdir)
for entry in os.listdir(subdir_path):
p = os.path.join(subdir_path, entry)
if os.path.isdir(p):
continue
uniq = entry.split(self.colon)[0]
self._toc[uniq] = os.path.join(subdir, entry)

Ungetestet. Falls was kaputt geht -- ich war's nicht.

Peter

PS: Die 'for subdir'-Schleife ist ein Überbleibsel des Originals und
eigentlich nicht mehr nötig.

Ähnliche fragen