2009-04-16 14 views
2

Ich habe eine XML-Datei der Größe 31 GB. Ich muss die Gesamtzahl der Zeilen in dieser Datei finden. Ich weiß, der Befehl wc -l wird mir das gleiche geben. Es dauert jedoch zu lange, um diese Operation durchzuführen. Gibt es einen schnelleren Mechanismus, um die Anzahl der Zeilen in einer großen Datei zu finden?Länge einer XML-Datei

+0

@Turing komplett: Es ist nicht unbedingt Schuld des OP, er ist vielleicht die Arbeit an einem Legacy-System oder etwas ähnliches. Die Frage ist gültig und verdient keine -1 – marcgg

Antwort

6

31 Gigs ist eine wirklich große Textdatei. Ich wette, es würde auf etwa 1,5 Gigs komprimiert werden. Ich würde diese Dateien zunächst in einem komprimierten Format erstellen, dann können Sie eine dekomprimierte Version der Datei über wc streamen. Dies wird die Menge an I/O und Speicher, die zum Verarbeiten dieser Datei verwendet werden, stark reduzieren. gzip kann komprimierte Streams lesen und schreiben.

Aber ich würde auch folgende Anmerkungen machen:

  • Zeilennummern sind nicht wirklich so informativ für XML als Leerraum zwischen Elementen ignoriert wird (außer für gemischte Inhalte). Was möchten Sie wirklich über den Datensatz wissen? Ich wette, das Zählen von Elementen wäre nützlicher.
  • Stellen Sie sicher, dass Ihre XML-Datei nicht unnötig redundant ist, zum Beispiel wiederholen Sie die gleichen Namespace-Deklarationen im gesamten Dokument?
  • Vielleicht XML ist nicht der beste Weg, um dieses Dokument zu vertreten, wenn sie etwas suchen, in wie Fast Infoset sind versuchen
+0

Gute Idee über gziped Streams. Ich bin gespannt auf die Auswirkungen auf die Leistung (ich habe keine 31-GB-XML-Datei zum Spielen) –

4

Wenn Sie nur die Zeilenanzahl benötigen, ist wc -l so schnell wie alles andere.

Das Problem ist die 31 GB Textdatei.

1

Nein, nicht wirklich. wc wird ziemlich gut optimiert werden. 31GB ist eine Menge von Daten, und das Einlesen in Zeilen zu zählen wird eine Weile dauern, egal welches Programm Sie verwenden.

Auch diese Frage ist nicht wirklich für Stack Overflow geeignet, da es überhaupt nicht um Programmierung geht.

+0

Sie können immer eine Programmierlösung haben –

3

Wenn die Genauigkeit kein Problem ist, suchen Sie die durchschnittliche Zeilenlänge und teilen Sie die Dateigröße damit. Auf diese Weise können Sie eine sehr schnelle Annäherung erhalten. (Achten Sie darauf, die verwendete Zeichencodierung zu berücksichtigen.)

+0

Wie finden Sie die durchschnittliche Zeilenlänge ohne die gesamte Datei zu lesen? – harto

+0

Ich habe gerade über eine qualifizierte Schätzung nachgedacht oder vielleicht einmal eine statische Analyse gemacht und diesen Wert verwendet. – sris

+0

@harto Die Datei mit verschiedenen Offsets abtasten und extrapolieren. –

2

Dies ist über den Punkt hinaus, an dem der Code refaktoriert werden sollte, um Ihr Problem vollständig zu vermeiden. Eine Möglichkeit, dies zu tun, besteht darin, alle Daten in der Datei stattdessen in einer Tupelspeicher-Datenbank zu speichern. Apache couchDB und Intersystems Cache sind zwei Systeme, die Sie dafür verwenden können und die für die Art der Daten, mit denen Sie es zu tun haben, viel besser optimiert sind.

Wenn Sie wirklich mit der XML-Datei festgefahren sind, besteht eine andere Möglichkeit darin, alle Zeilen im Voraus zu zählen und diesen Wert zwischenzuspeichern. Jedes Mal, wenn eine Zeile zur Datei hinzugefügt oder aus ihr entfernt wird, können Sie eine Zeile hinzufügen oder von der Datei entfernen. Stellen Sie außerdem sicher, dass Sie eine 64-Bit-Ganzzahl verwenden, da mehr als 2^32 Zeilen vorhanden sein können.

1

Ist das Zählen von Zeilen ziemlich unsicher, da XML in newline im Grunde nur eine kosmetische Sache ist? Es wäre wahrscheinlich besser, die Anzahl der Vorkommen eines bestimmten Tags zu zählen.

Verwandte Themen