Autor Thema: Schneller(er) Zugriff auf Folder möglich ?  (Gelesen 4012 mal)

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Schneller(er) Zugriff auf Folder möglich ?
« am: 20.12.04 - 16:48:34 »
Komischerweise habe ich mir über dieses Problem noch nie Gedanken gemacht, aber jetzt spielt es eine zeitkritische Rolle:

Ich benötige eine Übersicht über die Namen aller Folder in einer Datenbank. Das Standardverfahren via NotesDatabase.Views und anschliessendem Filtern über NotesView.IsFolder ist im gegebenen Szenario performancemässig untragbar.
Verwende ich Damien Katz's DBDesign Class, kann ich das Procedere schon mal um den Faktor 3 beschleunigen.

Frage: Geht das auch noch schneller ? Beim standardmässigen Öffnen einer DB im Client sind die Folder-Informationen ja auch "sofort" parat. Vielleicht habe ich ja auch nur ein Brett vor'm Kopf ...

Danke im Voraus,
Bernhard
« Letzte Änderung: 20.12.04 - 18:33:09 von koehlerbv »

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re: Schneller(er) Zugriff auf Folder möglich ?
« Antwort #1 am: 20.12.04 - 16:54:32 »
Naja, der Client greift ja schliesslich via API zu und da ist schonmal mindestens ein Faktor 10 gegenüber LS zu verzeichnen.

Schlechte Karten, ausser mit einer DLL - schätze ich mal.
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re: Schneller(er) Zugriff auf Folder möglich ?
« Antwort #2 am: 20.12.04 - 16:58:46 »
Bernhard, hast Du es mal mit der NotesNoteCollection-Klasse getestet?

Ich habe keine Ahnung wie das performance-seitig aussieht, aber könnte schnell sein.
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re: Schneller(er) Zugriff auf Folder möglich ?
« Antwort #3 am: 20.12.04 - 17:03:02 »
2. Idee:
Eine View für Folder.
Also View Selection glaub ich wäre SELECT @Contains($Flags; "F")
Der Name und Alias des Folders steht dann glaub ich im Item $Title.
Weiß aber auch nicht ob das schneller ist.
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re: Schneller(er) Zugriff auf Folder möglich ?
« Antwort #4 am: 20.12.04 - 17:24:34 »
hier noch etwas in die Richtung, die Matthias vorgeschlagen hat. http://www.dominopower.com/issuesprint/issue199908/design.html
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Schneller(er) Zugriff auf Folder möglich ?
« Antwort #5 am: 20.12.04 - 17:39:50 »
Merci beaucoup, Jens und Matthias und Ulrich. Ich bin dran an Matthias' Tip mit der NotesNoteCollection, aber bisher sieht es schlechter aus als bei dem API-Verfahren von Damien Katz.

Bernhard
« Letzte Änderung: 20.12.04 - 18:33:31 von koehlerbv »

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Schneller(er) Zugriff auf Folder möglich ?
« Antwort #6 am: 20.12.04 - 18:19:51 »
Jo, ich habe jetzt mal ein wenig getestet mit der NotesNoteCollection. Keine Ahnung, warum ich die nicht eher in Betracht gezogen habe. Das Brett ?

Quick and dirty habe ich mal zum Testen folgendes zusammengeschustert:

Code
	
	Dim session As New NotesSession
	Dim dbMail As New NotesDatabase ("", "")
	Dim nc As NotesNoteCollection
	Dim szNoteID As String
	Dim docDesign As NotesDocument
	Dim iLoop As Integer
	Dim szMessage As String
	
	Dim vStartTime As Variant
	Dim vEndTime As Variant
	
	Call dbMail.OpenMail
	
	vStartTime = Now
	Set nc = dbMail.CreateNoteCollection (False)
	Call nc.SelectAllIndexElements (True)
	nc.SelectFolders = True
	Call nc.BuildCollection
	
	szNoteID = nc.GetFirstNoteId
	For iLoop = 1 To nc.Count
		Set docDesign = dbMail.GetDocumentByID (szNoteID)
		If Instr (docDesign.~$Flags (0), "F") > 0 Then
			szMessage = szMessage & docDesign.~$Title (0) & Chr$ (10)
		End If
		
		szNoteID = nc.GetNextNoteId (szNoteID)
	Next
	
	vEndTime = Now
	Msgbox "Elapsed time: " & Cdat (vEndTime - vStartTime) & " to retrieve " & Cstr (nc.Count) & " elements."
	
	Messagebox szMessage,, "Gefundene Folder"
	

Ich komme jetzt auf Werte, die etwas besser als mit API / Damien Katz' DBDesign Class sind. Hauptsächlich geschuldet ist dies der Tatsache, dass
   nc.SelectFolders = True
   Call nc.BuildCollection
entgegen der Benamsung doch nicht nur Folder zurückgibt, sondern auch Ansichten. Der erste Massage-Kiste im Code gibt daher auch einen Wert aus, der nicht mit der dann angezeigten Anzahl an Folders übereinstimmt.

Ich werde mit also die bereits funktionierende Variante (API) aufheben (wegen der R5-Kompatibilität) und jetzt mal schauen, ob ich das mit der NotesNoteCollection noch verfeinern kann.

Wegen der View mit Design-Elementen: Das kann ich partout nicht einsetzen, da ich von DB A auf beliebige DB B oder C oder ... zugreife und dort das Design nicht beeinflussen kann / will.

Jede weitere Idee ist herzlich willkommen (API ?) ! Und ich werde posten, wenn ich noch eine signifikante Performanceverbesserung hinbekomme.

Bernhard
« Letzte Änderung: 20.12.04 - 18:34:16 von koehlerbv »

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re: Schneller(er) Zugriff auf Folder möglich ?
« Antwort #7 am: 20.12.04 - 18:27:17 »
API habe ich abgecheckt:
in C++ gibt es ein LNDatabase::GetFolder.

C++ ist aber nur der wrapper der C API. Daher müsste man alle Befehle des GetFolder wieder aufdrösels; mit LS wrappen und  .. landet wieder bei Damien Katz' Lösung.

Also von daher sehe ich keine weiter Verbesserungsmöglichkeit.

Ausser, man bildet das als DLL ab.
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re: Schneller(er) Zugriff auf Folder möglich ?
« Antwort #8 am: 20.12.04 - 18:40:39 »
Evtl. kann man im oben geposteten Script noch andere Schleifen testen.
In der BP-Schleifenkunde wird in einem der letzen Kapitel auf Performance-Tests verwiesen.
Zumindest ein paar Millisekunden könnten drin sein  ;)

Ansonsten:

Vielleicht kann man mit den Methoden der NotesNoteCollection - Klasse noch was optimieren.

Ohne mir das jetzt die Klasse im Detail angesehen zu haben (ehrlich gesagt weiß ich jetzt nicht genau, was SelectAllIndexElements macht):
Zitat
Call nc.SelectAllIndexElements (True)
nc.SelectFolders = True
Call nc.BuildCollection
Wie groß ist da die Collection? Sind da nur noch Folders drin oder alle Designelemente?

Falls alle Designelemente:
Ich machte bisher immer die Auswahl mit 'SelectAllDesignElements'.
Evtl. kann man dann nach und nach den Rest rauswerfen (also z.B. nc.SelectAllFormatElements = False, nc.SelectNavigators = False usw.).
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re: Schneller(er) Zugriff auf Folder möglich ?
« Antwort #9 am: 20.12.04 - 19:04:45 »
Also von daher sehe ich keine weiter Verbesserungsmöglichkeit.

Ausser, man bildet das als DLL ab.

Das war, was ich von anfang an befürchtete
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Schneller(er) Zugriff auf Folder möglich ?
« Antwort #10 am: 20.12.04 - 19:08:05 »
Jo, Matthias, Du hast mir da ein wichtiges Stichwort geliefert.

Ich erreiche nochmals eine Performanceverbesserung von 25% und eine Halbierung der übertragenen Datenmenge, wenn ich die NotesNoteCollection auch korrekt verwende (wie vorhin schon gesagt: Der erste Entwurf war ausdrücklich "quick and dirty" zur Abschätzung der Dimensionen):

Code
	Set nc = dbMail.CreateNoteCollection (False)
	nc.SelectFolders = True
	Call nc.BuildCollection

Dann habe ich (logischerweise) wirklich nur noch die Folders drin.

Hier mal ein paar Zahlen, um die Verfahren besser zu verstehen (ich habe sado-mado-mässig meinem Domino-Server auch eine 22 MBit-WLAN-Karte spendiert, um in meiner Entwicklungsarbeit auch langsame Reaktions- und Übertragungszeiten "simulieren" zu können):

NotesDatabase.Views und Zugriff auf meine Mail-DB: 1,4 MB, 17 Sekunden (incl. Ausfiltern der Views)

Damien Katz' DBDesign: 1,3 MB, 5 Sekunden

NotesNoteCollection: 0,7 MB, 3..4 Sekunden.

Ergo: Wenn es nicht auf R5-Kompatibilität ankommt, ist man mit der NoteDocumentCollection bestens bedient.

@Ulrich: Danke für Deine Bestätigung, dass sich mit der C++-API die Katze letztlich doch wieder in den Schwanz beisst. Dies bestätigte meine Ahnung.

Bernhard

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re: Schneller(er) Zugriff auf Folder möglich ?
« Antwort #11 am: 20.12.04 - 19:08:35 »
Bernhard: von wie vielen Ordnern ist eigentlich die Rede ?
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Schneller(er) Zugriff auf Folder möglich ?
« Antwort #12 am: 20.12.04 - 19:23:32 »
Im wahrsten Sinne des Wortes: "Keine Ahnung", Ulrich. Ich kann vorab nicht bestimmen, auf was für DBs bzw. "ordnungswütige" Leute ich da treffe.
In meiner Test-DB sind es 31 Ordner in einer 200 MB-Datei.

Bernhard

Offline magic_halli

  • Senior Mitglied
  • ****
  • Beiträge: 348
  • Geschlecht: Männlich
Re: Schneller(er) Zugriff auf Folder möglich ?
« Antwort #13 am: 13.02.09 - 11:56:39 »
Hi,

Zitat
Das Standardverfahren via NotesDatabase.Views und anschliessendem Filtern über NotesView.IsFolder ist im gegebenen Szenario performancemässig untragbar.

Das Thema Folderzugriff hat mich auch längere Zeit beschäftigt! Die allseits verbreitete Variante über Views hat mich übers WAN bald WAN-sinnig gemacht!  ;)

@Bernhard
Cool, dass Du das mal so ausführlich getestet hast! Bin (leider) erst jetzt und nicht schon früher auf diesen Post gestoßen...
Ich hab die "Foldersearch" bei mir implementiert und eine hammergeile Performancesteigerung um Faktor 20, was Zeit und Datenmenge angeht, erziehlt!!!  8)

Damit kann ich ab jetzt prima leben.

Daumen hoch für diesen Post!!!


Gruß

Rico.


PS: Sollte diese Thema nicht irgenwo schön sichtbar gepinnt werden?!
Lotus Notes 8.0.2

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Schneller(er) Zugriff auf Folder möglich ?
« Antwort #14 am: 13.02.09 - 12:01:53 »
Dieses Thread hast Du auch gefunden?

Bernhard

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz