2009-04-07 4 views
3

Es gibt einige Standard-Tools, um dies zu tun, aber ich brauche eine einfache GUI, um einige Benutzer (unter Windows) zu unterstützen. Sie erhalten einen offenen Dateidialog und wählen die zu verarbeitende Datei aus.Effiziente Inline-Suche und Ersetzen für große Datei

Die Datei wird eine XML-Datei sein. Die Datei enthält (innerhalb der ersten Zeilen) eine Textzeichenfolge, die gelöscht oder durch Leerzeichen ersetzt werden muss (egal welche).

Das Problem ist, dass die XML-Datei mehrere Gigabyte groß ist, aber die feste Suche und ersetzen Zeichenfolge wird innerhalb der ersten 4k oder so auftreten.

Was ist der beste Weg, um die Suchzeichenfolge zu überschreiben und in-place zu speichern, ohne dass die gesamte Menge in den Speicher gelesen oder übermäßig auf die Festplatte geschrieben werden muss?

+0

Auf der tatsächlichen S & R. Gibt es dafür eine Standard-API? Es erscheint sinnlos, einen von Grund auf neu zu schreiben. –

+0

LPTSTR StrStr ( LPCTSTRlpFirst, LPCTSTRlpSrch ); Raten Sie, ich werde versuchen, dies zu tun. Nicht vertraut mit Windows überhaupt ... –

Antwort

1

Offensichtlich durch Leerzeichen ersetzen, so dass die Größe der Datei als Ganzes nicht ändert, ist hier die beste Wahl, andernfalls müssen Sie die gesamte Datei streamen, um auf der Festplatte zu aktualisieren.

Wenn dies für eine Unix-Umgebung war, würde ich in mmap() verwenden, um einen geeigneten Teil des Beginns der Datei in RAM zu mappen, dann bearbeiten Sie es in-Place und fertig sein.

This snippet zeigt, wie Sie das Win32-Äquivalent, die CreateFileMapping()-Funktion verwenden.

+0

Danke. Ich schätze, die CFM() - Funktion ermöglicht das Zuordnen nur einer Teildatei in den RAM, und das OS wird den Rest verarbeiten. Ich werde es mir ansehen. –

0

Sie können einfach Ihr eigenes Werkzeug schreiben. Wenn es am Anfang steht, dann wird jeder Brute-Force-Ansatz funktionieren. Scanne einfach weiter, bis du es gefunden hast.

Das Vermeiden von Festplattenschreibvorgängen ist jedoch nur möglich, wenn Sie die Dateigröße nicht ändern. Wenn Sie Bytes irgendwo in der Mitte löschen oder einfügen möchten, müssen Sie alle folgenden überschreiben. In Ihrem Fall wäre praktisch die gesamte Datei. Sie müssen es also durch Leerzeichen ersetzen. Solange Sie nur ein Byte durch ein anderes ersetzen, entsteht kein Overhead.