1Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
11
11
ZUGRIFFE
1040
1040
EMPFEHLEN
-
06.02.11 13:25 #1
- Registriert seit
- Jun 2008
- Ort
- Nah bei Köln
- Beiträge
- 252
Hallo zusammen,
arbeite momentan an einem etwas Umfangreicheren Projekt, nämlich einem EMail-Client mit Organizer und Plugins sowie einer Multi-MEssengerfunktion.
Klappt ja alles soweit so gut. Kurz zum Aufbau: Das Programm verwaltet seine Daten innerhalb einer SQLite Datenbank. D.h. Emails, Accounts, Ordner usw sind in den jeweiligen Tabellen einsortiert. Mails Abrufen und senden funktioniert wunderbar, arbeite mit der OpenPop.NET (hpop) Klasse und der SmtpClient Klasse auss dem Framework.
Folgendes Problem tritt nun auf:
Wenn ich meine Mails aus der Datenbank abrufen will, und in einem bestimmten Ordner (den ich über das Interface anklicke, um die Mails aufzulisten) mehr als, sagen wir 30 Mails, existieren, braucht das Programm bestimmt 3 Sekunden und noch länger für den Abruf und die Auflistung in einer ListView. Das wird für den späteren Benutzer sehr lästig sein. Thunderbird hat das irgendwie besser gelöst, doch die haben ja TextFiles als MailDatenbank, da kann ich mir also nichts abgucken.
Allerdings denke ich schon die Ursache gefunden zu haben. Ich habe meine Verwaltungsklassen (in diesem Fall Classes.Mail.MailDirectory und Classes.Mail.MailMessage) so programmiert, dass beim Abruf eines Attributes eine SQL-Abfrage (SELECT) ausgeführt wird. Da das bei jeder Mail bestimmt 10 Mal vorkommt, habe ich knapp 300 Abfragen in einer Kurzen Zeit. Dazu kommt noch der Abruf der EMail-Liste durch Classes.Mail.MailDirectory->MailsInDirectory, was ebenfalls nochmal 30 Abfragen verursacht. (id der jew. Email wird abgerufen)
Wie kann ich das umgehen? Gibt es Caching-Möglichkeiten ohne dass das Programm gleich wortwörtlich den Arbeitsspeicher mit Rumpf und Stumpf auffrisst?
Gleich hier mal eine kleine Kostprobe eines Attributes:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/// <summary> /// Gets or sets the status of the message. If the message has been read, set it to true. /// </summary> public bool IsRead { get { if (DBConnected) { // Init Query and select emails table DataBase.DataBaseSelectQuery DirectoryQuery = new DataBase.DataBaseSelectQuery("emails"); // Select IsRead-Field DirectoryQuery.SelectFields(new string[] { "IsRead" }); DirectoryQuery.AddWhereClause("id = '" + EmailID.ToString() + "'"); // Execute the Query. DataBase.DataBaseResult Result = DataBaseHandler.Query(DirectoryQuery); return Convert.ToBoolean(Result.ResultSet[0][0].Value); } return false; } set { // [...] } }
Vielen Dank schonmal im Voraus!Geändert von WorldRacer (06.02.11 um 13:27 Uhr)
-
Hi
Du kannst Cache entweder temporär halten im RAM oder persistent z.B. in einer Datenbank.
Letzteres ist eher langsam. Du musst dich alao entscheiden.
Vielleicht solltest du aber erstmal versuchen, die Datenbank abfragen zu reduzieren. 10 Abfragen für ein Mail halte ich für definitiv zu viel!Grüße Nico
----------------------
Xing
----------------------
Zitat von Mark Twain (1835-1910)
Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
-
07.02.11 13:27 #3
- Registriert seit
- Jun 2008
- Ort
- Nah bei Köln
- Beiträge
- 252
Hallo,
danke für die Tipps. Gibt es sonst eine Möglichkeit, die Geschwindigkeit zu optimieren? Denn wenn ich den Cache in die Datenbank schreibe, hab ich ja wieder Abfragen, die Zeit brauchen. Da kann ich das ganze ja im Endeffekt zu lassen. Die Datenbank in den RAM zu schreiben ist unklug, denn eine Maildatenbank könnte durchaus bis zu 4-5GB groß werden
-
Hi
Halte nur die Infos im Cache, die du da auch brauchst! Also die Infos, die angezeigt werden, ohne das der Anwender ein Objekt öffnet. In solchen Fällen kannst du dann eine zusätzliche Abfrage ausführen.Grüße Nico
----------------------
Xing
----------------------
Zitat von Mark Twain (1835-1910)
Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
-
08.02.11 10:05 #5Technologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL
-
18.02.11 20:50 #6
- Registriert seit
- Jun 2008
- Ort
- Nah bei Köln
- Beiträge
- 252
Hallo zusammen,
@RudolfG: Ich wollte meinen Benutzern eigentlich nicht zumuten, für ein E-Mail Programm einen MySQL-Server zu installieren. Zum einen sind das unnötige Services, die das Allgemeinbefinden des Anwenderrechners verschlechtern, zum anderen ist die Sicherheit eigentlich kein Problem, da es keine Netzwerk-Datenbankapplikation ist.
Gibt es eigentlich noch andere Datenverwaltungsmethoden, abgesehen von XML- und Text-Dateien, die dieses Programm beschleunigen könnten?
Vielen Danke für eure Hilfe!
-
Du wirst nicht viele Optionen haben.
Aber nochmal: Aktuell macht es den Eindruck, dass du entweder alles in den Speicher laden willst oder für jeden Information an die Datenbank gehst.
Beides ist von der Herangehensweise suboptimal (wie du ja schon gemerkt hast). Halte nur die Daten im Speichern, die aktuell für die Präsentation notwendig sind (z.B. Absender, Betreff, Datum, Priorität). Den Rest kannst du laden, wenn die Daten benötigt werden.
Ich kann mir nur nicht vorstellen, das deine Anwendung in Umgebungen mit einer Postfachgröße von 5 GB zum Einsatz kommt. Die Größe solcher Postfächer kommt für gewöhnlich nur Unternehmen vor und da werden Archivierungstools verwendet, um die Postfächer klein zu halten (z.B. Enterprise Vault)Grüße Nico
----------------------
Xing
----------------------
Zitat von Mark Twain (1835-1910)
Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
-
19.02.11 21:57 #8
- Registriert seit
- Jun 2008
- Ort
- Nah bei Köln
- Beiträge
- 252
Ich kann mir nur nicht vorstellen, das deine Anwendung in Umgebungen mit einer Postfachgröße von 5 GB zum Einsatz kommt. Die Größe solcher Postfächer kommt für gewöhnlich nur Unternehmen vor und da werden Archivierungstools verwendet, um die Postfächer klein zu halten (z.B. Enterprise Vault)
Da muss ich dich leider Enttäuschen, denn Ich habe bereits eine Postfachgröße (in Thunderbird) von 7GB. Teilweise kommen bei uns in der Redaktion auch Prostfachgrößen von 20GB vor.
-
Dann solltet ihr ernsthaft über Email-Archivierung nachdenken! Bei solchen Mengen hat jeder Mail Client Probleme
Grüße Nico
----------------------
Xing
----------------------
Zitat von Mark Twain (1835-1910)
Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
-
21.02.11 13:14 #10
Oder wenn es wirklich notwendig sein sollte, dass man immer E-Mails haben/sehen muss, auf einen SQL-Server zu setzen. Dieser kann/sollte dann auf euren zentralen Redaktions-Server laufen und somit von jeder Arbeitsstation erreichbar sein.
Allerdings fällt mir jetzt auch kein Grund ein, immer auf alle E-Mails Zugriff haben zu müssen.Technologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL
-
Bei einer Email-Archivierung hat man immer Zugriff auf seine Mails. Auch auf die Archivierten.
Ich seh allerdings keine Grund, wieso man einen eigene Mail-Client implementiert, wenn es doch Hunderte am Markt gibt.
Grüße Nico
----------------------
Xing
----------------------
Zitat von Mark Twain (1835-1910)
Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
-
21.02.11 22:41 #12Technologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL
Ähnliche Themen
-
[SQLite] Anfänger frage bzw C# und SQLite
Von Lensen im Forum Relationale DatenbanksystemeAntworten: 4Letzter Beitrag: 14.12.11, 12:50 -
In SQLite den höchsten Wert abfragen
Von Teilzeitphilosoph im Forum Relationale DatenbanksystemeAntworten: 1Letzter Beitrag: 09.03.10, 15:39 -
[C#] Timer macht Programm unheimlich langsam!
Von der jonas im Forum .NET CaféAntworten: 5Letzter Beitrag: 27.10.08, 08:30 -
Abfragen von Extenem Programm?
Von mrno im Forum JavaAntworten: 5Letzter Beitrag: 22.11.06, 07:57 -
Explorer langsam, wenn ein Netzlaufwerk langsam
Von Coalminer im Forum Microsoft WindowsAntworten: 0Letzter Beitrag: 15.06.06, 15:58





Zitieren


Login





