2012-08-06 10 views
7

Ich habe zwei große Textdateien mit jeweils mehr als 10 Millionen Zeilen. Wie kann ich die Dateien vergleichen und verschiedene Zeilen in den Dateien mit C++ erhalten.Vergleichen von riesigen Dateien mit C++

Ich habe versucht, eine Datei in den Speicher zu laden und den Speicher sortiert und die binäre Baumlogik verwendet, um die Dateien zu vergleichen. Es verglich und gab mir das Ergebnis in 20 Sec. Aber es verbraucht mehr Speicher. (Die Textdatei ist ungefähr 500 MB).

Ich möchte zwei Dateien vergleichen, ohne mehr Speicher, eine gute Leistung und minimale Auswirkungen auf die Festplatte zu verbrauchen.

+7

Der erste Schritt ist die Auswahl einer Sprache. Die Lösungen werden für C und C++ unterschiedlich sein. – juanchopanza

+6

Würde ein Diff-Tool nicht Ihren Anforderungen entsprechen? Leichter als das Rad neu erfinden. – user7116

+2

Lassen Sie die Sprache CPP sein –

Antwort

4

können Sie eine Zwei-Pass-Methode verwenden.

ersten Durchlauf, Sie lesen Dateien, aber nur Hash-Wert und Zeile Start Pos von Zeilen speichern, dann können Sie Dateien auf Hash-Wert vergleichen, lesen Sie nur die Zeilen erneut für den vollständigen Vergleich im zweiten Durchlauf, wenn zwei Zeilen haben die gleiche Hashwert. Dies spart Speicherverbrauch und CPU-Zeit, mit ein bisschen Strafe, um einige Zeilen zweimal zu lesen.

+0

Ich schlug das gleiche vor, aber dann dachte ich, dass, wenn Hash ** gleich ** (fast) immer den Text abrufen könnte notwendig sein, um sicher zu sein, Vergleich. Daher ist diese naive Strategie vielleicht nicht sehr effektiv. OTH diff sollte etwas ähnliches verwenden. – CapelliC

+0

Wenn es Ihnen egal ist, ob Sie ein oder zwei Mal einen Fehler machen, bevor das Universum endet, verwenden Sie einfach 128-Bit-Hash-Code über die Quellzeilen. Die Wahrscheinlichkeit, einen schlechten Vergleich für 10 Millionen Zeilen zu erhalten, ist (1-2^(- 128)) * 10^7 ~~ 1-2^(- 103). Scheint sicher genug. –

+0

@IraBaxter Nun, eigentlich interessiere ich mich;) und ich denke eine Menge Leute kümmern sich auch. – FrostNovaZzz