Domino 9 und frühere Versionen > ND9: Entwicklung
Datenexport Performance optimiert
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