2012-12-19 18 views
5

Ich versuche, die Suche nach einer Zeichenfolge in einer großen Textdatei (300-600 MB) zu optimieren. Mit meiner derzeitigen Methode dauert es zu lange.C# Suche große Textdatei

Derzeit verwende ich IndexOf, um nach der Zeichenfolge zu suchen, aber die Zeit, die es dauert, ist viel zu lang (20s), um einen Index für jede Zeile mit der Zeichenfolge zu erstellen.

Wie kann ich die Suchgeschwindigkeit optimieren? Ich habe versucht Contains(), aber das ist auch langsam. Irgendwelche Vorschläge? Ich habe an Regex-Match gedacht, aber ich sehe keinen signifikanten Geschwindigkeitsschub. Vielleicht ist meine Suchlogik fehlerhaft

Beispiel

while ((line = myStream.ReadLine()) != null) 
{ 
    if (line.IndexOf(CompareString, StringComparison.OrdinalIgnoreCase) >= 0) 
    { 
     LineIndex.Add(CurrentPosition); 
     LinesCounted += 1; 
    } 
} 
+2

Wonach suchen Sie genau? Wörter? – Lloyd

+1

Was ist Ihr CompareString .. bitte zeigen Sie ein Beispiel von dem, was Sie suchen .. – MethodMan

+0

Sind Sie sicher, dass es Ihr suchender Teil ist? Wie lange dauert es, um überhaupt nichts zu überprüfen und nur die Datei Zeile für Zeile zu lesen? –

Antwort

9

Die Brute-Force-Algorithmus Sie führt verwenden in O (nm) Zeit, wo n die Länge der Zeichenfolge gesucht wird und m Die Länge des Teilstrings/-musters, die Sie suchen. Sie benötigen einen String-Suchalgorithmus verwenden:

jedoch einen regulären Ausdruck mit Sorgfalt gestaltete könnte ausreichend sein, je nachdem, was Sie versuchen zu finden. Siehe Jeffrey's Friedl 's tome, Mastering Regular Expressions für Hilfe beim Erstellen effizienter regulärer Ausdrücke (z. B. kein Backtracking).

Sie könnten auch einen guten Algorithmus Text konsultieren. Ich bin teilweise zu Robert Sedgewick der Algorithms in seiner various incarnations (Algorithmen in [C | C++ | Java])

+0

danke! Ich werde versuchen, mit einer Regex-Suche - wenn es zu langsam ist. Ich werde in die verschiedenen Suchalgorithmen schauen Sie oben – user1747467

1

Haben Sie diese Fragen gesehen (und Antworten)?

es die Art und Weise tun Sie jetzt sind, scheint der Weg zu sein, zu gehen, wenn alles, was Sie tun wollen, um die Textdatei gelesen wird. Andere Ideen:

  • Wenn es möglich ist, die Daten vorab sortieren, wie wenn sie in die Textdatei eingefügt werden, helfen, dass könnten.

  • Sie können die Daten in eine Datenbank einfügen und nach Bedarf abfragen.

  • Sie könnten eine Hash-Tabelle verwenden

1

Sie können Benutzer regexp.Match (String). RegExp Match ist schneller.

static void Main()

{

string text = "One car red car blue car"; 
    string pat = @"(\w+)\s+(car)"; 

    // Instantiate the regular expression object. 
    Regex r = new Regex(pat, RegexOptions.IgnoreCase); 

    // Match the regular expression pattern against a text string. 
    Match m = r.Match(text); 
    int matchCount = 0; 
    while (m.Success) 
    { 
    Console.WriteLine("Match"+ (++matchCount)); 
    for (int i = 1; i <= 2; i++) 
    { 
     Group g = m.Groups[i]; 
     Console.WriteLine("Group"+i+"='" + g + "'"); 
     CaptureCollection cc = g.Captures; 
     for (int j = 0; j < cc.Count; j++) 
     { 
      Capture c = cc[j]; 
      System.Console.WriteLine("Capture"+j+"='" + c + "', Position="+c.Index); 
     } 
    } 
    m = m.NextMatch(); 
    } 

}

2

Leider, ich glaube nicht, dass es eine ganze Menge Sie in geraden C# tun können.

Ich habe gefunden, dass der Boyer-Moore-Algorithmus für diese Aufgabe extrem schnell ist. Aber ich fand, dass es keine Möglichkeit gab, das so schnell wie IndexOf zu machen. Meine Annahme ist, dass dies so ist, weil IndexOf in handoptimierten Assembler implementiert ist, während mein Code in C# ausgeführt wurde.

Sie können meine Code und Leistung Testergebnisse in dem Artikel Fast Text Search with Boyer-Moore sehen.

+0

hm, so dass Sie IndexOf vorschlagen würde Der schnellste Weg, ich kann eine einfache Zeichenfolge suchen? Bisher hat die Verwendung dieser Methode meine Datei auf etwa 30 s erhöht. Ich denke, ich werde sehen, ob es Alternativen gibt, um die Geschwindigkeit bei der Suche zu erhöhen ... – user1747467

+0

Ja, wenn yo Ihre Suche unterscheidet zwischen Groß- und Kleinschreibung. Ansonsten ändern sich die Überlegungen. –

+0

Nein, meine Suche unterscheidet nicht zwischen Groß- und Kleinschreibung. einfache Zeichenfolge Textsuche, fragte sich, ob IndexOf ist das schnellste, das für diese Aufgabe in C# implementiert werden kann - wenn es ist - dann müsste ich mein Design ändern und wählen Sie eine andere Plattform – user1747467

Verwandte Themen