From bbee19367901938f3b5014cc80f0037a9b569a94 Mon Sep 17 00:00:00 2001 From: Carlo Strub Date: Sun, 17 Sep 2017 00:56:17 +0200 Subject: [PATCH] improve memory footprint --- CHANGELOG.md | 3 +++ classify.go | 4 +++- learn.go | 5 +++++ mail.go | 9 +++++++++ mail_test.go | 22 ++++++++++++++++++++++ 5 files changed, 42 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b4e999..8c3b2fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ - Converted the entire app to a [Twelve-Factor App](https://12factor.net/). This has consequences in how you launch it, i.e. use environment variables instead of flags. +- The interval between learning periods can be set at runtime now. +- Unload mail content after classification and learning, should reduce memory + requirements. ## Fixed - Only permit unicode characters of bitsize larger than 2, this guarantees we diff --git a/classify.go b/classify.go index dfd97eb..de60b54 100644 --- a/classify.go +++ b/classify.go @@ -178,7 +178,9 @@ func (m *Mail) Classify(db *bolt.DB, dir Maildir) (err error) { }).Info("Moved to Junk folder") } - return nil + err = m.Unload(dir) + + return err } // Junk returns true if the wordlist is classified as a junk mail using Bayes' diff --git a/learn.go b/learn.go index c52c7dc..3d56063 100644 --- a/learn.go +++ b/learn.go @@ -98,6 +98,11 @@ func (m *Mail) Learn(db *bolt.DB, dir Maildir) (err error) { // Update the statistics counter err = m.learnStatistics(db) + if err != nil { + return err + } + + err = m.Unload(dir) return err diff --git a/mail.go b/mail.go index f28396e..a8e9dc1 100644 --- a/mail.go +++ b/mail.go @@ -125,6 +125,15 @@ func (m *Mail) Load(dir Maildir) (err error) { return nil } +// Unload removes a mail's subject and body from the internal cache +func (m *Mail) Unload(dir Maildir) (err error) { + + m.Subject = nil + m.Body = nil + + return nil +} + func trimStringFromBase64(s string) string { if idx := strings.Index(s, "Content-Transfer-Encoding: base64"); idx != -1 { return s[:idx-1] diff --git a/mail_test.go b/mail_test.go index 1445d73..9502ee1 100644 --- a/mail_test.go +++ b/mail_test.go @@ -123,6 +123,28 @@ var _ = Describe("Mail", func() { Junk: true, })) }) + It("Unload mail content from struct", func() { + m := s.Mail{ + Key: "1488226337.M327822P8269.mail.carlostrub.ch,S=3620,W=3730", + Subject: nil, + Body: nil, + Junk: true, + } + + err := m.Load("test/Maildir") + Ω(err).ShouldNot(HaveOccurred()) + + err = m.Unload("test/Maildir") + Ω(err).ShouldNot(HaveOccurred()) + + Ω(m).Should(Equal( + s.Mail{ + Key: "1488226337.M327822P8269.mail.carlostrub.ch,S=3620,W=3730", + Subject: nil, + Body: nil, + Junk: true, + })) + }) It("Fail if Subject has already content", func() { st := "test" m := s.Mail{