Autor Thema: Datenexport Performance optimiert  (Gelesen 9014 mal)

Offline Legolas

  • Senior Mitglied
  • ****
  • Beiträge: 446
  • Geschlecht: Männlich
Re: Datenexport Performance optimiert
« Antwort #20 am: 21.07.16 - 15:41:46 »
Hallo Forum,

hier noch eine kleine Quellcodeänderung die es nochmals deutlich performanter machte:
Insgesamt wurden aufgrund der diversen Optimierungen die Exportzeit in der TestDB von 1 Minute 40 Sek. auf 5 Sekunden reduziert.  :)

Code
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	Dim  s(2) As String, r(2) As String
	s(0) = Chr(10)
	s(1) = Chr(13)
	s(2) = ";"
		
	r(0) = " "
	r(1) = " "
	r(2) = ","

	'Export Dateiname
	sFilename = "C:\temp\All-EXCEL-export.csv"
	Print sFilename
	
	'Falls die Datein vorhanden ist, wird diese gelöscht.
	On Error Resume Next
	Kill sFilename
	On Error GoTo errhandler
	
	iFilenum = FreeFile
	Open sFilename For Output As iFilenum
	Print #iFilenum, sHeadline
	
	Set viewentry = viewNav.Getfirst()
	Do While Not (viewentry Is Nothing)
		lLauf = lLauf+ 1 
		If llauf Mod 20  = 0 Then
			Print "Export Datensatz...  " & lLauf & " / " &  lDocQuantity
		End if

		vColValues=viewentry.ColumnValues()
		For iK = 0 To iColQuantity-1
			If lDataSet = 0 Then 
				sb.append(Replace(cstr(vColValues(lDataSet)), s, r))
			Else
				sb.append(";" + Replace(CStr(vColValues(lDataSet)), s, r))
			End If
		Next
				
		'Daten schreiben...		
		Print #iFilenum, sLine
		
		Set viewentry = viewNav.GetNext(viewentry)
	Loop
	Close iFilenum
Arbeite klug, nicht hart.

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: Datenexport Performance optimiert
« Antwort #21 am: 22.07.16 - 08:15:14 »
Da fehlt aber ein bisschen was.. ich vermute "sb" ist ein Objekt der Klasse "StringBuffer"... und wo der StringBuffer tatsächlich in die Datei geschrieben wird, fehlt auch...
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline Legolas

  • Senior Mitglied
  • ****
  • Beiträge: 446
  • Geschlecht: Männlich
Re: Datenexport Performance optimiert
« Antwort #22 am: 22.07.16 - 08:28:38 »
Hi Tode,

das war vielleicht etwas missverständlich. Ich wollte nur den Teil mit dem "Replace" posten. Als Ergänzung zum bestehenden Code.
Hier aber für alle nochmals der gesamte Code mit Einbindung der StringBuffer Klasse, die Tode weiter oben erwähnt hatte.

Code
Sub Initialize
	On Error GoTo errhandler

	Dim ses As New NotesSession
	Dim db As NotesDatabase
	Dim view As NotesView
	
	Dim viewColumn As NotesViewColumn
	Dim viewentry As NotesViewEntry
	Dim viewNav As NotesViewNavigator
	
	Dim vColValues As Variant
	Dim lDocQuantity As Long
	Dim iColQuantity As Integer
	Dim iK As Integer
	Dim vHeadline As Variant
	Dim sHeadline As String
	Dim sPath As String
	Dim sFilename As String
	Dim iFilenum As Integer
	Dim sLine As String
	Dim lLauf As long
	Dim zwerg As String

	Set db = ses.currentDatabase
	Set view = db.Getview("Excel-Export")
	If view Is nothing Then
		MsgBox "EXCEL-Export Ansicht ist nicht vorhanden!", 64, "Hinweis"
		Exit sub
	End If
	
	view.Autoupdate = False
	iColQuantity=view.ColumnCount
	
	Set viewNav = view.Createviewnav()
	lDocQuantity = viewNav.Count
	viewNav.BufferMaxEntries = 400	
	viewNav.EntryOptions = Vn_entryopt_nocountdata
	
	'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	'Spaltenüberschriften ermitteln
	vHeadline = view.columns()
	For iK=0 To iColQuantity-1
		If iK = 0 Then
			sHeadline = vHeadline(iK).title
		Else
			sHeadline = sHeadline +";" + vHeadline(iK).title
		End If
	Next 

	'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	'Export Dateiname
	sFilename = "C:\temp\All-EXCEL-export.csv"
	Print sFilename
	
	'Falls die Datein vorhanden ist, wird diese gelöscht.
	On Error Resume Next
	Kill sFilename
	On Error GoTo errhandler
	
	iFilenum = FreeFile
	Open sFilename For Output As iFilenum
	Print #iFilenum, sHeadline
	
	Dim sb As New StringBuffer(30)
	Dim  s(2) As String, r(2) As String
	s(0) = Chr(10)
	s(1) = Chr(13)
	s(2) = ";"
	
	r(0) = " "
	r(1) = " "
	r(2) = ","
	
	Set viewentry = viewNav.Getfirst()
	Do While Not (viewentry Is Nothing)
		lLauf = lLauf+ 1 
		If llauf Mod 20  = 0 Then
			Print "Export Datensatz...  " & lLauf & " / " &  lDocQuantity
		End if

		vColValues=viewentry.ColumnValues()
		For iK = 0 To iColQuantity-1
			If iK = 0 Then 
				sb.append(Replace(CStr(vColValues(iK)), s, r))
			Else
				sb.append(";" + Replace(CStr(vColValues(iK)), s, r))
			End If
		Next
				
		'Daten schreiben...		
		Print #iFilenum, sb.toString
		Call sb.Erase
		
		Set viewentry = viewNav.GetNext(viewentry)
	Loop
	Close iFilenum
	
	MsgBox "Ende", 64, "Note"	
	Exit Sub
	
errhandler:
	MsgBox "Error in Agent: MS-EXCEL export      Error: " & Error & " (" & Err &  ") in Zeile: " & Erl, 64, "Hinweis"
	close
	Exit Sub
End Sub


Arbeite klug, nicht hart.

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: Datenexport Performance optimiert
« Antwort #23 am: 22.07.16 - 08:45:25 »
Jetzt hast Du aber immer noch ein "+" drin, Du kriegst also noch ein "klitzekleines" bisschen mehr raus, wenn Du die Zeile

Code
sb.append(";" + Replace(CStr(vColValues(iK)), s, r))

ersetzt durch

Code
sb.append(";")
sb.append(Replace(CStr(vColValues(iK)), s, r))
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
Re: Datenexport Performance optimiert
« Antwort #24 am: 02.08.16 - 14:12:38 »
Interessantes Thema und interessanter Thread.

Frage: was spricht gegen Implode?

Statt
Code
	Do While Not (viewentry Is Nothing)
		lLauf = lLauf+ 1 
		If llauf Mod 1000  = 0 Then
			Print "Export Datensatz...  " & lLauf
		End If

		vColValues=viewentry.ColumnValues()
		For iK = 0 To iColQuantity-1
			If iK = 0 Then 
				sb.append(Replace(CStr(vColValues(iK)), s, r))
			Else
				sb.append(";" + Replace(CStr(vColValues(iK)), s, r))
			End If
		Next
				
		'Daten schreiben...		
		Print #iFilenum, sb.toString
		Call sb.Erase
		
		Set viewentry = viewNav.GetNext(viewentry)
	Loop

einfach

Code
	Do While Not (viewentry Is Nothing)
		lLauf = lLauf+ 1 
		If llauf Mod 1000  = 0 Then
			Print "Export Datensatz...  " & lLauf
		End If

		vColValues=viewentry.ColumnValues()
				
		'Daten schreiben...		
		Print #iFilenum, Implode(vColValues,";")
		
		Set viewentry = viewNav.GetNext(viewentry)
	Loop

macht in meiner Test-DB (exportierte Excel-Datei 49.152 Zeilen, 90,7MB) einen Unterschied von 33s --> 12s Gesamt-Laufzeit aus. Sprich: der Export ist in etwas mehr als einem Drittel der Zeit fertig.

 ;D

Vielleicht sind Deine Daten ja so sauber in der View, daß Du gar kein großartiges Brimborium wie StringBuffer etc. brauchst? Versuch's doch mal...

Gruß,
Th.

Update: Habe in meiner Export-Ansicht jede Menge weitere Spalten eingefügt. 90s --> 38s. Wahrscheinlich geht's doch eher nur in Richtung 50%+ Zeiteinsparung.  :-\
« Letzte Änderung: 02.08.16 - 14:35:17 von thkn777 »

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz