Domino 9 und frühere Versionen > ND9: Entwicklung

Datenexport Performance optimiert

<< < (4/5) > >>

Thomas Schulte:

--- Zitat von: Ralf_M_Petter am 18.07.16 - 15:45:53 ---Habe es schnell mal ausprobiert, die Variante mit den gesetzten Buffermaxentries benötigt bei einer Demodatenbank von mir 2,8 Sekunden und ohne Buffermaxentries benötigt es 74,6 Sekunden.
--- Ende Zitat ---

Wie groß ist hier deine Datenbasis?

Legolas:
Hallo Zusammen,

nachdem ich gesehen habe, dass hier wohl reges Interesse an diesem Thema ist, anbei meinen vereinfachten Quellcode.
Vielleicht kann den ja mal jemand brauchen. ;)

Zielsetzung:
- Möglichst performanten Datenexport. Datenbasis mit sehr großen Datenmengen. (100.000 Dokumente und mehr, Ansicht mit 160 Spalten)
Bedingungen:
- Die Exportansicht darf keine Multivalue Einträge beinhalten. Diese müssen zuvor in der Ansicht mit dem @Implode Befehl in einen String umgewandelt werden.
- Der Export wird als CSV Datei geschrieben und kann dann in EXCEL importiert werden.

Verbesserungsvorschläge zur Performanceoptimierung sind erwünscht!

Grüße
Bernd


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

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
zwerg = vColValues(iK)
zwerg = Replace(zwerg, Chr$(10), " ")
zwerg = Replace(zwerg, Chr$(13), " ")

If iK = 0 Then
sLine = zwerg
Else
sLine = sLine +";" + zwerg
End If
Next

'Daten schreiben...
Print #iFilenum, sLine

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:
Vielleicht ein Paar Gedanken zum Code:

1. Wenn Du noch mehr Performance brauchst (und zwar SIGNIFIKANT mehr), dann musst Du die Zeile sLine = sLine + ";" + zwerg durch die StringBuffer- Klasse von Julian Robichaux ersetzen, oder einen NotesStream verwenden, siehe hier.
2. Ein CSV- Export so wie Du ihn machst ist gefährlich:
Du solltest vor der String- Concatenation ENTWEDER alle Strings, die bereits einen Strichpunkt enthalten durch Anführungszeichen einschließen (dann musst Du bestehende Anführungszeichen ebenfalls maskieren oder ersetzen), oder die Strichpunkte durch etwas ersetzen, was Dir Deine CSV NICHT kaputt macht.
3. view.ColumnCount ist oftmals GRÖSSER als entry.ColumnValues, weil in ColumnCount ALLE Spalten gezählt werden, und in ColumnValues Konstanten und spezialwerte (wie z.B. @DocNumber) nicht drin sind, Du bekommst also in vielen Ansichten einen "Array Index out of Bounds" mit Deinem Code
Gruß
Torsten

Legolas:
Hi Torsten,

danke für die schnelle Rückmeldung:

zu 1) Werde ich mir noch anschauen. Danke für den Topp.
zu 2) Das ist über die Ansicht schon gewährleistet. In den paar Spalten in denen Freitext eingebbar ist, werden die Werte in der Spalte schon geparst.
zu 3) Die Ansicht ist speziell für den Export aufbereitet und beinhaltet keine versteckten, kategorisierten oder sonstige Spalten, die nicht als Standard Spalte im Format "String" angezeigt werden.

Aufgrund der Performanceoptimierung hatte ich schon so viel Formatierungsprüfung wie möglich in die Ansicht verlegt. Das @Chr(10) und $Chr(13) soll dort auch noch mit rein.

Grüße
Bernd

diali:
du kannst die Anzahl der Spalten reduzieren, indem du mehrere Spalten in eine zusammenfasst.

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln