Frage

Ich suche eine KMP (oder ähnlich) zu einer großen Datei (> 4 GB) suchen anzuwenden.

Ich erwarte das mir Probleme geben though.I nicht alles in den Speicher kopiert werden kann, weil es nicht genügend Platz vorhanden ist.

Meine Frage ist, was ist die beste Art und Weise über das Tun diese Suche zu gehen? Soll ich einfach eine Datei * erstellen und die Suche direkt in der Datei tun, soll ich Blöcke kopieren (etwa 4k) in dem Speicher und suche diejenigen, oder etwas anderes völlig?

War es hilfreich?

Lösung

Wenn Sie eine Plattform verwenden, die es unterstützt, können Sie mmap () verwenden. Paginierung der Datei ist auch eine Möglichkeit, aber nicht vergessen, den Puffer so groß wie möglich zu halten, den IO-Overhead zu reduzieren und vorsichtig zwischen den Grenzen von zwei Seiten zu sein (angenommen, eine Zeichenfolge übereinstimmt, werden aber von der Seitengrenze gespaltet)

Alternativ empfehle ich Ihnen, einen Index irgendeiner Art zu bauen, und verwenden Sie den Index, um die Suche einzuschränken. KMP-Suche ist nicht besonders effizient. Dies hängt natürlich von der Art der Datei, wie es wird erstellt, etc.

Andere Tipps

Für den Dateizugriff würde ich empfehlen, Memory-Mapped-Datei zu verwenden, um die Datenkopie zu vermeiden. Es ist trivial auf Unix-Maschinen. Ebenso können Sie die Dateizuordnung in kleinere Blöcke aufgeteilt müssen, wenn sie nicht in einem Block zugeordnet werden können. Ich kann einen Code zur Verfügung stellen, wenn Sie interessiert sind.

Für die Suche würde ich empfehlen, die Boyer Weiterem Suchalgorithmus .

Die Suche direkt in der Datei wäre sehr langsam, Pufferung mit vielen besseren Leistung geben wird. Aber beachten Sie, dass Ihr Puffer größer sein als das, was Sie suchen (SearchLength), natürlich, und Sie haben die Puffer zu aktualisieren, wenn vor seinem Ende SearchLength Bytes zu sein.

Best Ansatz ist es in den Blöcken zu lesen und suchen, dass. Sie sollten die Blockgröße ein Parameter machen, so können Sie experimentieren mit dem, was die beste Leistung gibt.

Allerdings ist es in der Regel effizienter, die Datei in irgendeiner Weise zu versuchen und Index, so dass Sie nicht linear über die gesamte Datei suchen müssen. Zum Beispiel ist KMP ein String-Suchalgorithmus - suchen Sie nur für occuences eines Wortes? Dann können Sie einfach eine Hash-Tabelle (auf der Platte) der Worte und ihre Position in der Datei erstellen und haben sehr effiziente Suche.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top