Abhängig von ho Wenn Sie oft die Suche durchführen möchten, möchten Sie eine Suchmaschine verwenden oder nicht. Wenn Sie häufig suchen möchten, verwenden Sie eine Suchmaschine, andernfalls nicht. Ich werde beschreiben, wie Sie beide Szenarien hier implementieren.
Wenn Sie eine Suchmaschine verwenden: Es klingt wie Sie nach Teilstrings suchen, was bedeutet, dass Sie Ihre Dateien als solche mit Ihrer bevorzugten Suchmaschine indizieren sollten, vorzugsweise eine, die Sie anpassen können (Lucene, Terrier, etc.). Die Technik, die Sie hier brauchen, ist das Indizieren von Trigrammen, dh alle 3-stelligen Kombinationen müssen indiziert werden. ZB: 'foobar' erzeugt 'foo', 'oob', 'oba' und 'bar'. Bei der Suche möchten Sie dasselbe mit Ihrer Abfrage durchführen und eine Suchmaschinenkombination mit dem UND aller dieser Trigramme ausgeben. (Das führt einen Merge-Join auf den Buchungslisten aus den Dokumenten aus, die ihre IDs zurückgeben oder was auch immer Sie in die Buchungslisten setzen).
Alternativ können Sie Suffix-Arrays implementieren und Ihre Dateien einmal indizieren. Dies gibt ein wenig mehr Flexibilität, wenn Sie nach kurzen (1-2 Zeichen) Teilzeichenfolgen suchen, aber in Bezug auf Indizes ist es schwieriger zu verwalten. (Es gibt einige Forschung bei CWI/Amsterdam für schnelle Indizierung Suffix-Arrays)
Wenn Sie nur ein paar Mal suchen möchten, ist der Algorithmus entweder Boyer-Moore (ich benutze normalerweise Boyer-Moore-Sonntag wie in beschrieben) [Graham A. Stephen, Zeichenkettensuche]) oder ein kompiliertes DFA (Sie können sie aus einem NFA konstruieren, was einfacher zu machen ist). Dies führt jedoch nur zu einer kleinen Geschwindigkeitssteigerung, da Disk-IO wahrscheinlich der Flaschenhals ist und ein paar Bytes, die Sie sowieso dekodieren müssen, ziemlich schnell sind.
Die größte Verbesserung, die Sie machen können, ist das Lesen Ihrer Datei Zeile für Zeile, aber in Blöcken. Sie sollten NTFS so konfigurieren, dass Sie eine Blockgröße von 64 KB verwenden, wenn Sie können, und die Dateien in Multiplizierungen von 64 KB lesen - denken Sie an 4 MB oder mehr in einem einzelnen Lesevorgang. Ich würde sogar vorschlagen, asynchrone IO zu verwenden, so dass Sie gleichzeitig lesen und verarbeiten können (zuvor gelesene Daten). Wenn Sie es richtig machen, sollte Ihnen das bereits eine Implementierung in Sekundenbruchteilen für 10 MB auf der modernsten Hardware geben.
Last but not least, ist ein netter Trick beim Informationsabruf auch, Ihre Daten mit einem schnellen Komprimierungsalgorithmus zu komprimieren. Da Disk-IO langsamer als Speicher/CPU-Operationen ist, wird dies wahrscheinlich auch helfen. Der Snappy-Komprimierer von Google ist ein gutes Beispiel für einen schnellen Komprimierungsalgorithmus.
Ihre Verlangsamung kommt wahrscheinlich aus dem Lesen der Dateien Zeile für Zeile. Lies eine Datei auf einmal in den Speicher und suche danach. – dda
http://stackoverflow.com/questions/4289353/fastest-way-to-search-ascii-files-in-c-sharp-for-simple-keywords – Ofiris
Müssen Sie die gleichen Dateien mehrmals durchsuchen? – user626528