DataTable per Code füllen

06/03/2009 - 11:27 von Heiko Bauer | Report spam
Hallo!

Ich habe in meiner Applikation eine Auflistung von ca. 10.000 Objekten, die
ich mit hoher Performance in ein DataTable-Objekt einfügen muss.

Die Objekte haben drei Eigenschaften: "Messwertname", "Messwertergebnis",
"Messzeitpunkt".

Der DataTable hat die Felder:
"Messzeitpunkt", "Messergebnis für Parameter 1", "Messwertergebnis für
Parameter 2", (ca. 70 verschiedene Parameter).

Im Moment sieht mein Algorithmus so aus:
- In einer Schleife durch alle Objekte durchgehen
- Nachschauen, ob für den Messzeitpunkt schon eine Zeile in der DataTable
existiert (mit datatable.SELECT, extrem langsam)
- Wenn Zeile existiert, dann dort den Wert des Objektes eintragen
- Wenn noch keine Zeile existiert, dann eine neue mit den Objektdaten
anlegen.

Da das bis zu 2 Minuten dauert, suche ich jetzt schon seit Tagen nach einer
Alternative.
Aktuell hab ich gelesen, dass man die "LoadDataRow"-Methode nehmen kann, die
automatisch schaut, ob eine Zeile existiert und dann selbst ein Add oder ein
Update durchführt. Allerding ist dafür ein PrimeryKey nötig, der nur integer
sein darf (was übrigens die Dokumentation verschweigt !!!!). Außerdem sind
meine Zeilen ja in jeder Objektschleife mit nur einem der Messwerte gefüllt,
es müsste also ein "Merge" innerhalb der Zeile gemacht werden, was
vermutlich gar nicht funktioniert.

Kann mir jemand einen sinnvollen Tipp geben, wie ich das mit extrem guter
Performance hinbekommen kann? Googglen hat mir in diesem Fall ausnahmsweise
keine Erkenntnisse gebracht...

Vielen Dank!
Heiko
 

Lesen sie die antworten

#1 Peter Fleischer
06/03/2009 - 21:12 | Warnen spam
"Heiko Bauer" schrieb im Newsbeitrag
news:


Kann mir jemand einen sinnvollen Tipp geben, wie ich das mit extrem guter
Performance hinbekommen kann? Googglen hat mir in diesem Fall
ausnahmsweise keine Erkenntnisse gebracht...



Hi Heiko,
ich habe das Szenario mal nachgstellt und komme auf meinem recht langsamen
Laptop auf ca. 233 msec für die 10000 Objekte. Hier mein Test:

Option Explicit On
Option Infer On
Option Strict On

Public Module Module1
Sub Main()
' Tabelle aufbauen
Console.WriteLine(" Tabelle aufbauen")
Dim dt As New DataTable
With dt
With .Columns
.Add("Messzeitpunkt", GetType(Date))
For i = 1 To 70
.Add("MW" & i.ToString("00"), GetType(Double))
Next
End With
End With
Dim dv = dt.DefaultView
dv.Sort = "Messzeitpunkt"
' Liste mit Objekten laden
Console.WriteLine(" Objektliste aufbauen")
Dim l As New List(Of c1)
For i = 1 To 10000
l.Add(New c1 With {.Messwertname = "MW" & CInt(1 + 69 *
Rnd()).ToString("00"), _
.Messwertergebnis = Rnd(), _
.Messzeitpunkt = Now.Date.AddMinutes(CInt(100 *
Rnd()))})
Next
'
Dim t = Now
Console.WriteLine(" Tabellen füllen")
For Each itm In l
Dim recNr = dv.Find(itm.Messzeitpunkt)
Dim ind As Integer = CType(itm.Messwertname.Substring(2, 2), Integer)
Dim r As DataRow = Nothing
If recNr < 0 Then
r = dt.NewRow
r(0) = itm.Messzeitpunkt
dt.Rows.Add(r)
Else
r = dv(recNr).Row
End If
r.Item(ind) = itm.Messwertergebnis
Next
'
Console.WriteLine("Zeitaufwand: {0} msec",
Now.Subtract(t).TotalMilliseconds)
'
Console.WriteLine(" Ergebniszahl: {0}", dt.Rows.Count)
'
Console.ReadLine()
End Sub

Friend Class c1

Private _messwertname As String
Public Property Messwertname() As String
Get
Return _messwertname
End Get
Set(ByVal value As String)
_messwertname = value
End Set
End Property

Private _messwertergebnis As Double
Public Property Messwertergebnis() As Double
Get
Return _messwertergebnis
End Get
Set(ByVal value As Double)
_messwertergebnis = value
End Set
End Property


Private _esszeitpunkt As Date
Public Property Messzeitpunkt() As Date
Get
Return _esszeitpunkt
End Get
Set(ByVal value As Date)
_esszeitpunkt = value
End Set
End Property

End Class

End Module

Viele Grüsse
Peter

Ähnliche fragen