vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Datenbank/Satz suche mit fast 4 Millionen Zeilen 
Autor: lastyle
Datum: 11.11.14 23:58

Hallo zusammen,

da ich mich mit so einem "grossprojekt" noch nicht beschftigt habe frage ich bevor ich vollkommen falsch anfange lieber ersteinmal nach dem bestmöglichen Lösungsansatz.

Aufgabenstellung ist unter Visual Studio 2010:

Ich habe eine CSV Datei mit ca 3,8 Millionen Zeilen. Diese Zeilen beinhalten Dateinamen

Aus einer Containerdatei erstelle ich per shellexecute eine Datei mit dem Namen tmp.lst. In dieser tmp.lst stehen wiederrum Dateinamen in Anführungszeichen. Nun möchte ich für jeden Dateinamen aus der tmp.lst eine Suche starten innerhalb der CSV Datei. Falls der Dateiname gefunden wird kann nach dem nächsten Namen gesucht werden da er ja bereits vorhanden ist. Sollte ein Dateiname nicht in der CSV vorhanden sein möchte ich den Namen des Containers in eine Neue Liste schreiben.

Soweit ist das ja auch alles kein Problem, nur was nehme ich am besten für die CSV Datei um sie schnellstmöglich zu durchsuchen ? Soweit ich das richtig verstanden habe ist ja bei Listview oder Data Grid bei 2,xxx Mio einträgen schluss. Und ich möchte die CSV eigentlich beim Start in den Speicher Laden um die Festplattenzugriffe zu minimieren.

Danke schonmal

Beitrag wurde zuletzt am 11.11.14 um 23:59:49 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenbank/Satz suche mit fast 4 Millionen Zeilen 
Autor: Manfred X
Datum: 12.11.14 00:19

Hallo!

Zunächst einen Sortierzeiger für die Zeilen in der CSV aufbauen
und dann binäre Suche auf der Basis des Zeigers einsetzen ...
Falls genügend Hauptspeicher im PC vorhanden ist, um alle Daten
zu laden, kann das über eine generische Liste laufen.



Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenbank/Satz suche mit fast 4 Millionen Zeilen 
Autor: lastyle
Datum: 12.11.14 20:46

Hallo Manfred,

gibts da irgenwo einen Beispiel Source zu ?

Gruß Mario
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenbank/Satz suche mit fast 4 Millionen Zeilen 
Autor: Manfred X
Datum: 12.11.14 20:58

Schau Dir mal diese Funktion an ...

   ''' <summary>Klasse zur Aufbewahrung eines SortierSchlüssels und 
   ' zugehörigem Index
    ''' </summary>
    Public Class SortItem
        Implements IComparable(Of SortItem)
 
        Public Property FileSortString As String
        Public Property FileRowIndex As Integer
 
        Public Function CompareTo(other As SortItem) As Integer _
            Implements System.IComparable(Of SortItem).CompareTo
            Return Me.FileSortString.CompareTo(other.FileSortString)
        End Function
    End Class
 
 
    ''' <summary>Aufbau eines Sortier-Zeigers zu Zeilen einer CSV-Datei</summary>
    ''' <param name="CSVFile">Pfad einer CSV-Datei</param>
    ''' <param name="TextEncoder">Text-Encoding (meist: UTF8)</param>
    ''' <param name="columnindex">Array mit nullbasierten Indices der 
    ''' hierarchischen Sortierspalten (0=höchste Hierarchie-Stufe)</param>
    ''' <param name="columnlength">Array mit Angaben zur Länge der 
    ' Sortier-Teilschlüssel</param>
    ''' <param name="sortlst">sortierte Liste mit den Sortierschlüsseln und 
    ' den FileRowIndices</param>
    Public Function FillSortList(ByVal CSVFile As String, _
                                 ByVal TextEncoder As System.Text.Encoding, _
                                 ByVal columnindex() As Integer, _
                                 ByVal columnlength() As Integer, _
                                 ByRef sortlst As List(Of SortItem)) As Integer
 
        sortlst = New List(Of SortItem)
 
        If Not IO.File.Exists(CSVFile) Then Return -1
        If Not IO.Path.GetExtension(CSVFile).ToLower = ".csv" Then Return -1
 
        If columnindex Is Nothing OrElse columnindex.Length = 0 Then Return -1
        If columnlength Is Nothing OrElse _
            Not columnlength.Length = columnindex.Length Then Return -1
 
        Dim mincolumnindex As Integer = _
           Aggregate ind As Integer In columnindex Distinct Into Min()
        If mincolumnindex < 0 Then Return -1
 
        Dim maxcolumnindex As Integer = _
            Aggregate ind As Integer In columnindex Distinct Into Max()
 
        If (Aggregate ind As Integer In columnlength _
            Distinct Into Min()) < 3 Then Return -1
 
        Try
 
            Dim fri As Integer = -1, fss As String = "", content As String = ""
            Using sr As New IO.StreamReader(CSVFile, TextEncoder)
                While Not sr.EndOfStream
                    Dim fields() As String = sr.ReadLine.Split(";"c)
                    If fields.Length > maxcolumnindex Then
                        fri += 1 : fss = ""
 
                        For i As Integer = 0 To columnindex.Length - 1
                            content = fields(columnindex(i)).ToString.ToLower
 
                            'Länge des Inhalts an Vorgabe anpassen
                            Dim adds As Integer = columnlength(i) - _
                              content.Length
                            If adds > 0 Then
                                content &= New String(" "c, adds)
                            ElseIf adds < 0 Then
                                content = content.Substring(0, columnlength(i))
                            End If
                            fss &= content & " "
                        Next i
 
                        sortlst.Add(New SortItem With _
                                    {.FileRowIndex = fri, .FileSortString = _
                                    fss})
                    End If
                End While
            End Using
 
            If sortlst.Count = 0 Then Return 0
 
            sortlst.Sort()
 
            Return sortlst.Count
        Catch ex As Exception
            Return -1
        End Try
    End Function
Anwendungsbeispiel:

Dim lst As New List(Of SortItem)
 
'Liste mit Sortierschlüsseln füllen und sortieren
Dim index As Integer = FillSortList("C:\daten\sortable.csv", _
  System.Text.Encoding.UTF8, {0, 1}, {5, 3}, lst)
 
'Suche nach einem Schlüssel
index = lst.BinarySearch(New SortItem With {.FileSortString = "xxxx  yyy "})
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenbank/Satz suche mit fast 4 Millionen Zeilen 
Autor: effeff
Datum: 13.11.14 12:16

Ich würde die Daten in eine DataTable schreiben, für die ich dann einen Primary Key kreiere. Danach können die Daten per DataTable.Find schnell und unkompliziert gefunden werden. Die DataTable kannst Du dann als XML speichern.

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenbank/Satz suche mit fast 4 Millionen Zeilen 
Autor: Manfred X
Datum: 13.11.14 12:42

Hallo!


So weit mir bekannt, wendet die "Find"-Methode der Datarows-Auflistung
auch bei Nutzung des Primaryschlüssels eine O/N-Suche an.
Das wäre im Hinblick auf Effizienz bei langen Listen und einer
Vielzahl von Such-Operationen nicht mit binären Suche in einer
sortierten Liste vergleichbar (Log O/N).
Hast Du dazu andere Infoemationen?

3,8 Millionen Datensätze gehören nicht in eine XML-Datei.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenbank/Satz suche mit fast 4 Millionen Zeilen 
Autor: effeff
Datum: 13.11.14 14:25

Manfred X schrieb:
Zitat:

Hallo!
So weit mir bekannt, wendet die &quot;Find&quot;-Methode der
Datarows-Auflistung
auch bei Nutzung des Primaryschlüssels eine O/N-Suche an.
Das wäre im Hinblick auf Effizienz bei langen Listen und einer
Vielzahl von Such-Operationen nicht mit binären Suche in einer
sortierten Liste vergleichbar (Log O/N).
Hast Du dazu andere Infoemationen?


Ich habe nur beschrieben, wie ich der Einfachheit halber arbeiten würde. Wie effektiv das ist, vermag ich mangels Datenmasse und Testmöglichkeit nicht zu sagen...

Zitat:

3,8 Millionen Datensätze gehören nicht in eine
XML-Datei.


Es geht um die von mir beschriebene Möglichkeit darum, die in eine DataTable übernommenen Daten auch wieder speichern zu können -> mangels Datenbank ist eine XML-Datei dabei sicherlich effektiver, als die Daten nochmals aus einer Textdatei zu lesen...

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenbank/Satz suche mit fast 4 Millionen Zeilen 
Autor: Manfred X
Datum: 13.11.14 14:51

XML ist entwickelt worden, um zusätzlich zu den Daten eine
Struktur (Schema, Formate usw.) zu speichern, die für Menschen
lesbar sein soll (Text-Datei) und sich z.B. auch für DataBinding eignet.

Das führt dazu, daß das "Byte-Volumen" einer XML-Datei gewöhnlich erheblich
größer ist als das einer - mit entsprechenden Daten gefüllten - CSV-Datei.

Eine Optimierung (Effizienz) von Datensatz-Zugriffen ist bei XML
nicht das Ziel. Mehr als einige zehntausend Datensätze sollte man nicht
im XML-Code speichern. Falls keine Datenbank verfügbar ist, kann man
die reinen Daten in einer CSV speichern und erforderliche ergänzende
Angaben zu den Spalten der CSV-Zeilen z.B. in einer separaten Hilfsdatei
hinterlegen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenbank/Satz suche mit fast 4 Millionen Zeilen 
Autor: effeff
Datum: 13.11.14 15:33

Ja... Sicher... Ich schrieb doch, dass der Inhalt der CSV-Datei in eine DataTable importiert werden sollte... Um sich das weitere Arbeiten mit den Daten zu erleichtern, dafür würde ich dann eine XML nehmen... DatatableToXML ist eben recht bequem. Nicht, dass wir uns falsch verstehen: Es geht nicht daru, die XML als Datenbankersatz als Grundlage für ein Databinding zu haben, sondern nur daru, die Daten einfach zu speichern und zu lesen. Eine Größenbeschränkung von XML ist mir unbekannt; Einzig die Zeit beim Lesen der Daten wäre ein Kriterium, nicht unbedingt die höchtzulässige Anzahl an Datensätzen einer DataTable zu produzieren...

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenbank/Satz suche mit fast 4 Millionen Zeilen 
Autor: lastyle
Datum: 16.11.14 12:58

Ich bin noch am Hauptprogramm am feintunen bevor ich mit der Intregation beginnen werde.

Aber so als Info zwischendurch.

Die CSV Datei ist 222MB Gross mit derzeit 3,75 Mio Linien (Datensätzen) mit unterschiedlicher Länge.

Ich glaub als XML würd das Ding einfach zu gross.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenbank/Satz suche mit fast 4 Millionen Zeilen 
Autor: Chris7483
Datum: 21.11.14 12:01

Schlagt mich jetzt bitte nicht, aber warum keine SQLCE-Datei einfügen und die Daten darin halten?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenbank/Satz suche mit fast 4 Millionen Zeilen 
Autor: Manfred X
Datum: 21.11.14 13:27

Hallo!

Auch eingebettete Datenbanken haben Grenzen.

Bei einer größeren Anzahl von voneinander unabhängigen
Such-Operationen ist für eine effiziente Strategie die
Art der Datenquelle kaum bedeutsam.

Man wird im Hauptspeicher sortierte Such-Schlüssel für die
Sätze erstellen und darauf binäre Suche einsetzen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenbank/Satz suche mit fast 4 Millionen Zeilen 
Autor: Chris7483
Datum: 21.11.14 21:29

Klar, für eine effiziente Suche nicht... Zum speichern aber eher als ne xml-Datei. Bis 4 GB macht sie es ja mit...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenbank/Satz suche mit fast 4 Millionen Zeilen 
Autor: Christoph1972
Datum: 22.11.14 09:38

Ich würde versuchen die Datei auf einen SQL-Server zu bringen. Da sind 4 Millionen Datensätze nicht das Problem. Ich designe gerade ein Datenbank, die bis zu 650 Millionen Datensätze bereitstellen soll. Aktuell habe ich 200 Millionen Dummys in der DB und ein Select Command dauert aktuell 17 Sekunden, das finde ich in anbetracht der Datenmenge recht ansprechend. By the way: Du solltest nich Millionen von Datensätzen in ein Grid packen, die müssen nach und nach geladen werden.

Gruß
Christoph

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenbank/Satz suche mit fast 4 Millionen Zeilen 
Autor: Manfred X
Datum: 22.11.14 10:13

Ja, klar!
Aber es geht in diesem Thema nicht ums Speichern großer Datenmengen,
sondern um die effiziente Gestaltung von Such-Operationen.
Zu prüfen wäre eventuell, wie rasch solche Operationen durch Nutzung
eines geeigneten Datenbank-Index per SQL-Server ausgeführt werden können.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenbank/Satz suche mit fast 4 Millionen Zeilen 
Autor: Christoph1972
Datum: 22.11.14 10:29

Mir ging es auch nicht um das Speichern der Daten, das ist nur ein positiver Nebeneffekt, sogar mit integrierter Datensicherung. Wie "rasch" so eine Operation ausgeführt wird, hatte ich doch erwähnt. Ich finde die Performance von dem SQL-Server für die Datenmengen jedenfalls überzeugend.

Gruß
Christoph

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel