Domino 9 und frühere Versionen > ND9: Entwicklung

Datenexport Performance optimiert

<< < (5/5)

Legolas:
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
--- Ende Code ---

Tode:
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...

Legolas:
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



--- Ende Code ---

Tode:
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))
--- Ende Code ---

ersetzt durch


--- Code: ---sb.append(";")
sb.append(Replace(CStr(vColValues(iK)), s, r))
--- Ende Code ---

thkn777:
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
--- Ende Code ---

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
--- Ende Code ---

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.  :-\

Navigation

[0] Themen-Index

[*] Vorherige Sete

Zur normalen Ansicht wechseln