Hallo,
mein Programm hat ein Effizienzproblem, von dem ich hoffe, dass es sich beheben lässt. Die Szenerie:
Ich habe ein Korpus aus XML-Dokumenten (etwas über 90 MB), annotierte Zeitungstexte. Jedes einzelne Wort darin ist von eimem <W>-Tag umschlossen, der unter anderem das Attribut Lemma="..." enthält. [Ein Lemma ist die Wörterbuchform des konkreten Wortes; kommt zum Beispiel im Text "rätst" vor, so lautet das Lemma dazu "raten".]
Nun will ich alle diese Dokumente einlesen und aus den Daten eine Liste erstellen, die für jedes Lemma dessen Frequenz (wie oft kommt es vor), alle seine Wortformen und wiederum deren Frequenzen abspeichert, also zum Beispiel:
Lemma=raten,
Frequenz=3,
Wortform1=rätst, Frequenz1=2,
Wortform2=ratet, Frequenz2=1
Dafür habe ich eine Lemma-Klasse erstellt, die genau diese Infos pro Lemma-Objekt abspeichert. Ferner gibt es die Klasse Lemmaliste, die ein TreeSet aus Lemma-Einträgen aufbaut und verwaltet, nud eine Start-Klasse, die Pfade abfragt, lädt und speichert.
Allein das Einlesen der Dateien (mit Abspeichern der Infos) dauert etwa zwanzig Minuten. Gelesen wird mit einem SAX-Parser, weil ich die Dateien nur einmal brauche und dann nicht mehr, das dürfte gegenüber DOM effizienter sein (?). Ich habe keine Ahnung, ob das angesichts von 90 MB Daten normal ist, kommt mir aber zu langsam vor.
Die anschließende Verarbeitung nimmt noch mehr Zeit in Anspruch, insgesamt läuft das Programm rund eine Stunde. (Die Ausgabe erfolgt übrigens auch in eine XML-Datei, diese ist über 7 MB groß.)
Die Bremse vermute ich in den Datenstrukturen, genauer den TreeSets, in denen die Lemmata gespeichert werden. Da ich aber genau das will - eine sortierte Liste, bei der ich keine pauschale Obergrenze angeben muss - fällt mir da auf Anhieb keine Alternative ein ...
Meine Parser-Methode ist unspektakulär, ich erzeuge einen SAX-Parser und lasse ihn auf die Datei/en los. Die Eventhandler machen auch nichts Besonderes, extrahieren zwei Strings aus jedem <W>-Tag (eben Wort und Lemma) - dann aber werden die Funde in ein TreeSet mit Lemma-Einträgen eingefügt und, falls der Eintrag schon vorhanden ist, über das Set iteriert und die Frequenzangaben aktualisiert.
Für jedes Dokument wird ein solches TreeSet erstellt und dann vereinigt mit den bisher schon erstellten TreeSets.
Die meiste Zeit aber nimmt offenbar die Ausgabe in die XML-Datei in Anspruch (bzw. zunächst in einen großen String, der dann im letzten Schritt in die Datei geschrieben wird), auch hier wird wieder über das TreeSet iteriert.
Lässt sich anhand der Beschreibung schon etwas sagen - etwa zur Datenstruktur oder allgemeinen Herangehensweise - oder soll ich lieber Code posten?
mein Programm hat ein Effizienzproblem, von dem ich hoffe, dass es sich beheben lässt. Die Szenerie:
Ich habe ein Korpus aus XML-Dokumenten (etwas über 90 MB), annotierte Zeitungstexte. Jedes einzelne Wort darin ist von eimem <W>-Tag umschlossen, der unter anderem das Attribut Lemma="..." enthält. [Ein Lemma ist die Wörterbuchform des konkreten Wortes; kommt zum Beispiel im Text "rätst" vor, so lautet das Lemma dazu "raten".]
Nun will ich alle diese Dokumente einlesen und aus den Daten eine Liste erstellen, die für jedes Lemma dessen Frequenz (wie oft kommt es vor), alle seine Wortformen und wiederum deren Frequenzen abspeichert, also zum Beispiel:
Lemma=raten,
Frequenz=3,
Wortform1=rätst, Frequenz1=2,
Wortform2=ratet, Frequenz2=1
Dafür habe ich eine Lemma-Klasse erstellt, die genau diese Infos pro Lemma-Objekt abspeichert. Ferner gibt es die Klasse Lemmaliste, die ein TreeSet aus Lemma-Einträgen aufbaut und verwaltet, nud eine Start-Klasse, die Pfade abfragt, lädt und speichert.
Allein das Einlesen der Dateien (mit Abspeichern der Infos) dauert etwa zwanzig Minuten. Gelesen wird mit einem SAX-Parser, weil ich die Dateien nur einmal brauche und dann nicht mehr, das dürfte gegenüber DOM effizienter sein (?). Ich habe keine Ahnung, ob das angesichts von 90 MB Daten normal ist, kommt mir aber zu langsam vor.
Die anschließende Verarbeitung nimmt noch mehr Zeit in Anspruch, insgesamt läuft das Programm rund eine Stunde. (Die Ausgabe erfolgt übrigens auch in eine XML-Datei, diese ist über 7 MB groß.)
Die Bremse vermute ich in den Datenstrukturen, genauer den TreeSets, in denen die Lemmata gespeichert werden. Da ich aber genau das will - eine sortierte Liste, bei der ich keine pauschale Obergrenze angeben muss - fällt mir da auf Anhieb keine Alternative ein ...
Meine Parser-Methode ist unspektakulär, ich erzeuge einen SAX-Parser und lasse ihn auf die Datei/en los. Die Eventhandler machen auch nichts Besonderes, extrahieren zwei Strings aus jedem <W>-Tag (eben Wort und Lemma) - dann aber werden die Funde in ein TreeSet mit Lemma-Einträgen eingefügt und, falls der Eintrag schon vorhanden ist, über das Set iteriert und die Frequenzangaben aktualisiert.
Für jedes Dokument wird ein solches TreeSet erstellt und dann vereinigt mit den bisher schon erstellten TreeSets.
Die meiste Zeit aber nimmt offenbar die Ausgabe in die XML-Datei in Anspruch (bzw. zunächst in einen großen String, der dann im letzten Schritt in die Datei geschrieben wird), auch hier wird wieder über das TreeSet iteriert.
Lässt sich anhand der Beschreibung schon etwas sagen - etwa zur Datenstruktur oder allgemeinen Herangehensweise - oder soll ich lieber Code posten?