Autor Thema: Walk the View  (Gelesen 8684 mal)

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Walk the View
« am: 26.09.07 - 15:18:31 »
Hallo zusammen,

so böse Geschichte, muss redundante Daten aus einer DB löschen. Problem ist das die DB knapp 90.000 Dokumente umfasst. Sprenge mir jedes Array wenn ich versuche den passenden Schlüssel reinzuschreiben.

Also bin ich darauf zu kommen ein Wlak the View zu vollziehen, Problem ist ja wenn ich Dokumente rauslösche dass er durcheinander kommt, wenn ich zum Beispiel das Dokument lösche auf dem ich stehe.

Wie sieht es aus wenn ich die Spalte mit meinem Schlüssel kategorisiert anzeigen lassen und die 2 Spalte mit sortiere mit dem Wert der sehr wahrscheinlich der richtige ist ?

Hoffe die Beschreibung ist nicht all zu wirr.
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: Walk the View
« Antwort #1 am: 26.09.07 - 15:22:38 »
NotesDocumentCollection?
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline pete_bla

  • Senior Mitglied
  • ****
  • Beiträge: 455
  • Geschlecht: Männlich
  • dot net gitz net!
Re: Walk the View
« Antwort #2 am: 26.09.07 - 15:45:32 »
Hi,

Die notesDocumentCollection hat ja den vorteil von
.removeall
Der ist bei vielen doch schneller als ein enzelnes löschen.

wenn Du einzelne löscht, und "die verschwinden Dir" dann lade doch einfach das nächste schon vor dem löschen
ungefähr so:
Code
while not doc is nothing
   set docnext = view.getnextdocument(doc)
   call doc.remove(true)
   set doc = docnext 
wend

Viel Erfolg, Pete(r)
pete(r)

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Walk the View
« Antwort #3 am: 26.09.07 - 16:23:22 »
@m3 :

Ich sprenge doch bestimmt eine verdammte Grenze wenn ich 90.000 Dokumente einfüge , oder?

Aussderm lösche ich ja zwischendurch Dokumente, wenn ich auf nen leeren Slot springe, habe ich keinen Parameter mehr für getnextDocument. Und wenn ich mit getnthDocument arbeite springe ich am Ende aus der Kollektion, weil ja die Kollektion immer kleiner wird.

@pete_bla :

Die Idee ist gut, muss aber erst gucken inwiefern ich sie verwurste.
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Walk the View
« Antwort #4 am: 26.09.07 - 16:27:35 »
Zu Deinem eigentlichen Problem kann ich nichts sagen - ich kenne einfach nicht genügend Deiner Randbedingungen.

Aber: Eine DocumentCollection kannst Du nicht sprengen.
Und - ganz wichtig: Mit GetNthDocument arbeitet man nicht! Das geht bei 100 Dokumenten gut, aber schon ab 1.000 Dokumenten kannst Du jedem einzeln die Hand schütteln, und ab dem 10.000sten (oder so) wirst Du sterben, wenn Du bei jedem Dokument einen Kafee trinken gehst.
Arbeite mit GetNextDocument. Gleiches gilt auch für Collections.
(Hintergrund: Der Pointer zum Dokument muss jedes Mal neu von Anfang an gesetzt werden.)

Bernhard

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Walk the View
« Antwort #5 am: 26.09.07 - 16:49:18 »
Benutz einfach die Idee von pete bla
Oder diese docLast Variante :-)
Code
set doc = vw.getFirstDocument
while not doc is nothing
   set docLast = doc
   set doc = view.getnextdocument(doc)
   ' code zum prüfen, ob docLast gelöscht werden kann, wenn ja dann löschen (nächste Zeile)
   call docLast.remove(true)
   
wend

« Letzte Änderung: 26.09.07 - 16:53:51 von Axel Janssen »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Walk the View
« Antwort #6 am: 26.09.07 - 17:08:06 »
Ich befürchte, das "docLast" oder "docNext" lösen nicht Roberts Problem: Es sollen ja wohl Dubletten gelöscht werden. Und die können sich sonstwo in der View verstecken. Diese muss also dauernd reindexiert werden, und wo der Schuss nun gerade ein Loch hinterlassen hat, kann man ja nur aufwändig feststellen und merken.

Je mehr Dokumente während des Laufs nun gekillt werden, desto performancefressender würde auch bei einem inaktiven Index-AutoUpdate die nun erforderliche Prüfung, ob das gefundene (zu löschende oder zu bearbeitende Dokument) nun eine Leiche ist oder noch zappelt.

Wie schon oben gesagt: Hier kann man nur Empfehlungen geben, wenn man mehr über die Gesamtsituation und die Anforderungen weiss.

Bernhard

Offline Thomas Schulte

  • @Notes Preisträger
  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Re: Walk the View
« Antwort #7 am: 26.09.07 - 17:14:46 »
Alles in Listen reinschreiben und dann mit diesen arbeiten. Es könnte allerdings sein das du mit der Anzahl von Dokumenten zuverlässig einen RSOD erzeugst.
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline pete_bla

  • Senior Mitglied
  • ****
  • Beiträge: 455
  • Geschlecht: Männlich
  • dot net gitz net!
Re: Walk the View
« Antwort #8 am: 26.09.07 - 17:23:44 »
Hi,

wenns nun wirklich eine "einmalige Killaktion" sein sollte,
würde ich mal auf das klassische
Code
collection = db.Search(Formel,Nothing,0) 
verweisen,
da ja eine "Formel" dahinterliegt...
und dann
Code
collection.removeall()

Ich finde für sowas ist das db.Search() optimal!

Gruss, Pete(r)
pete(r)

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: Walk the View
« Antwort #9 am: 26.09.07 - 20:15:22 »
Also bei mir hat er gerade 7 Sekunden gebraucht, um mit getNextDocument eine Collection mit 31.499 Dokumenten zu durchlaufen.  :)
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Walk the View
« Antwort #10 am: 26.09.07 - 20:24:19 »
Wenn Du schon dabei bist: Und mit GetNthDocument?

Bernhard

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: Walk the View
« Antwort #11 am: 26.09.07 - 21:17:47 »
31.499 Dokumente in 367 Sekunden durchlaufen.
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Walk the View
« Antwort #12 am: 27.09.07 - 13:24:10 »
So , ich bedanke mich schon mal, hatte gestern leider die zeit nicht mehr um hier vorbei zu schauen.

Haber mit GetNextDocument gearbeitet , hier einmal der KernCode :

Code
	Set viewDoc = view.GetFirstDocument
	searchKey = Cstr(viewDoc.GetItemValue("pumpSearchKey")(0))
	i = 0
	While Not  viewDoc Is Nothing
		
		Set redundantDoc = view.GetNextDocument(viewDoc)
		While ready = False
			
			If Not redundantDoc Is Nothing Then
				If Cstr(redundantDoc.GetItemValue("pumpSearchKey")(0)) = searchKey Then			
					Call redundantDoc.Remove(True)
					Set redundantDoc = view.GetNextDocument(viewDoc)
				Else
					ready = True
				End If	
			End If
			i = i +1
			Print "Datensatz : " + Cstr(i) + " bearbeitet!"
		Wend
		
		Set viewDoc = view.GetNextDocument(viewDoc)		
		searchKey = Cstr(viewDoc.GetItemValue("pumpSearchKey")(0))
		ready = False
		i = i +1
		Print "Datensatz : " + Cstr(i) + " bearbeitet!"
	Wend		
	

Am Anfang arbeitet er auch richtig performant und dann so ab 13.500 Dokumenten wird es ziemlich langsam und am Ende hängt er sich ganz weg.

Kann mir einer sagen was ich besser machen kann.

Ach bevor ich es vergesse, durch eine View habe ich die Dokumente so sortiert, dass das erste Dokument mit dem Schlüssel auch gleich das richtige ist.
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Walk the View
« Antwort #13 am: 27.09.07 - 13:29:23 »
Hast Du die AutoUpdate-Property auf False gesetzt?

Was man häufig unterschätzt: Print-Statements fressen mehr Performance, als man denkt (das ist aber im Gegensatz zum hier vermutlich überforderten Indexer nicht das Killerkriterium).

Bernhard

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Walk the View
« Antwort #14 am: 27.09.07 - 13:31:04 »
Du meinst von der View ? Keine Ahnung muss ich gleich mal schauen.


Die Prints sollen drin bleiben, von wegen, damit man sieht dass er noch was tut.
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Driri

  • Gast
Re: Walk the View
« Antwort #15 am: 27.09.07 - 13:32:27 »
Was ist denn "ready" ?

Wofür ist die 2. While-Schleife gut (While ready=False) ?

Du zählst i innerhalb von 2 Schleifen hoch. Das führt zu falschen Ergebnissen.

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Walk the View
« Antwort #16 am: 27.09.07 - 13:37:34 »
ready ist ein Bool-Wert. Soll halt die abarbeitung unterbrechen.


i ist ja nur für mich als optisches Zeichen, dass da was passiert, selbst wenn was falsches drin steht ist "Bumms", weil er nix steuert. Aber ich glaube schon dass das richtige drin steht, zumindest hat mein Papier-PC das gesagt.
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline rbo

  • Frischling
  • *
  • Beiträge: 11
  • Ich liebe dieses Forum!
Re: Walk the View
« Antwort #17 am: 27.09.07 - 13:48:33 »
Hi,

ich persönlich würde es auch mit Listen machen...
Mir ist gerade ein wenig langweilig, versuch doch mal diesen Code (nicht getestet)
Code
	Dim searchkeys List As Boolean
	
	
	While Not viewDoc Is Nothing
		
		If Iselement(searchKeys(viewDoc.GetItemValue("pumpSearchKey")(0))) Then
			Call viewDoc.remove
		Else
			searchKeys(viewDoc.GetItemValue("pumpSearchKey")(0)) = True
		End If
		
		Set viewDoc = view.getNextDocument(viewDoc)
	Wend

Müsste wesentlich performanter sein als dein jetziger Code...
Sollte dir die Liste wirklich um die Ohren fliegen musst du ein anderes Medium zum zwischenspeichern gefundener Elemente finden (zb. Tempdoc)

Gruss René

EDIT:
So gehts natürlich nicht ganz, du mussts den Code ein wenig modifizieren weil

Set viewDoc = view.getNextDocument(viewDoc)

mit dem gelöschten Dok nicht klappt, Lösung steht allerdings weiter oben, dann sollte es passen...
   
« Letzte Änderung: 27.09.07 - 13:52:21 von rbo »

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Walk the View
« Antwort #18 am: 27.09.07 - 13:52:06 »
ja mit listen habe ich am anfang auch gearbeitet, nur ein Array, dass 90.000 * 39 byte fast kann mein system nicht. da laufen mir der ein oder andere speicher über.
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Walk the View
« Antwort #19 am: 27.09.07 - 13:56:06 »
Ist das nicht so einfacher?
Code
 
Dim lastValue as String

lastValue = "DAT_KANNES_ÜBERHAUPT_NICHT_GEBEN. ES_HARTO IMPROBABLE QUE una Casilla tenga un contenido así"
set doc = vw.getFirstDocument
while not doc is nothing
   
   set docLast = doc
   set doc = view.getnextdocument(doc)
   if docLast.pumpsearchkey(0) = lastValue then 
          lastValue = docLast.pumpsearchkey(0)
          call docLast.remove(true)
   else
        lastValue= docLast.pumpsearchkey(0)
   end if
wend
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz