XML-DOM Zugriffe bescheunigen?

Hi,

ich habe ein DOM-Document (org.w3c.dom.document), wobei ich für das Root-Element wenige Child-Elemente habe(max. 10), diese können dann jedoch u.U auch über 1000 Child-Elemente beinhalten, die sich nur durch die Attribute unterscheiden. (alle gleicher Elementtyp, ein Attribut „id“ ist „Primary Key“)

Da ich das Ding ständig durchsuchen muß (eben nach dieser ID), wüßte ich gerne, wie ich den Zugriff optimieren könnte, da ich derzeit nur linear suche.
(nimm Element, suche Attribut, wenn Wert ok, dann gib es zurück, ansonsten gehe zum nächsten…)

Gibts ne Möglichkeit, das ganze zu beschleunigen?

(ich habe mal was über ne Hash-Table gelesen, aber wie mache ich sowas optimal?)

Besten Dank

Winni

Moien

ich habe ein DOM-Document (org.w3c.dom.document)

Mein Beileid.

, wobei ich
für das Root-Element wenige Child-Elemente habe(max. 10),
diese können dann jedoch u.U auch über 1000 Child-Elemente
beinhalten, die sich nur durch die Attribute unterscheiden.
(alle gleicher Elementtyp, ein Attribut „id“ ist „Primary
Key“)

Da ich das Ding ständig durchsuchen muß (eben nach dieser ID),
wüßte ich gerne, wie ich den Zugriff optimieren könnte, da ich
derzeit nur linear suche.

Das schreit nach Hashtable (OK, die Elementanzahl ist ein bisschen klein für die ganz schweren Geschütze, aber eh, wenn du so fragst…).

Sind die „Primary Keys“ eindeutig ? Auch in allen Subgruppen ? Welche Klasse haben die ? (String, Integer, … Wertebereich ?)

Wenn durchsucht wird: immer über alle Subgruppen oder kann man manchmal welche ausschliessen ?

cu

Moien

ich habe ein DOM-Document (org.w3c.dom.document)

Mein Beileid.

Hi, wieso?

, wobei ich
für das Root-Element wenige Child-Elemente habe(max. 10),
diese können dann jedoch u.U auch über 1000 Child-Elemente
beinhalten, die sich nur durch die Attribute unterscheiden.
(alle gleicher Elementtyp, ein Attribut „id“ ist „Primary
Key“)

Da ich das Ding ständig durchsuchen muß (eben nach dieser ID),
wüßte ich gerne, wie ich den Zugriff optimieren könnte, da ich
derzeit nur linear suche.

Das schreit nach Hashtable (OK, die Elementanzahl ist ein
bisschen klein für die ganz schweren Geschütze, aber eh, wenn
du so fragst…).

In der einen Subgruppe sind schon über 1000 drin *gfg*

Sind die „Primary Keys“ eindeutig ? Auch in allen Subgruppen ?
Welche Klasse haben die ? (String, Integer, … Wertebereich
?)

Also innerhalb der Subgruppen sollten die IDs eindeutig sein.

In den anderen Subgruppen können die IDs noch einmal verwendet werden.

Wenn durchsucht wird: immer über alle Subgruppen oder kann man
manchmal welche ausschliessen ?

Also ich will schon bestimmen, in welchen Subgruppen ich suche…

cu

Also am besten einen Vector mit HashMap - Elementen und in denen dann suchen?

Gruß

Winni

Moien

ich habe ein DOM-Document (org.w3c.dom.document)

Mein Beileid.

Hi, wieso?

Mal ganz im Ernst: die API ist doch … eine Katastrophe. Und das ganze ist arschlangsam.

In der einen Subgruppe sind schon über 1000 drin *gfg*

Peanuts. Hashtables drehen bei mehr als 10000 Elementen richtig auf.

Sind die „Primary Keys“ eindeutig ? Auch in allen Subgruppen ?
Welche Klasse haben die ? (String, Integer, … Wertebereich
?)

Also innerhalb der Subgruppen sollten die IDs eindeutig sein.

In den anderen Subgruppen können die IDs noch einmal verwendet
werden.

OK, also 2 Ebenen:

  1. Ebene: Die Gruppen
    Du erzeugt eine Hashtable mit den „Namen“ der Gruppen als key und Hashtables als Values. Also in der Art:

Hashtable alleWerte = new Hashtable();

for (alle deine gruppen){
Hashtable gruppe = new Hashtable();
(die Hashtable füllen, mehr in Ebene 2)
alleWerte.put („name-der-gruppe“, gruppe);
}

  1. Ebene: Der Inhalt der Gruppe.

Du läufst den Inhalt der Gruppe linear ab. Für jedes Element X:

gruppe.put (ID-von-X,X);

Zum raussuchen:
Hashtable gruppe = (Hashtable) alleWerte.get(name-der-gruppe);
gesuchtesElement = (Elementklasse) gruppe.get(Id-des-Element);

Es gibt nur einen grossen Problemfall. Wenn du 2x die gleiche ID innerhalb einer Gruppe hast war alles für die Katz. In dem Fall muss man noch eine Ebene mit Vectoren unter der 2. einfügen. Anstelle von dem Einzeiler gruppe.put(…) ergibt sich:

Vector container = (Vector) gruppe.get(ID-von-X);
if (container == null){
container = new Vector();
gruppe.put (ID-von-X,container);
}
container.add(Element-X);

Beim suchen bekommt man dann auch immer zuerst einen Vector. Den dann linear ablaufen. Dieses Verpacken kostet allerdings richtig Zeit und Speicher. Ist aber immernoch viel, viel schneller als lineares ablaufen.

Also am besten einen Vector mit HashMap - Elementen und in
denen dann suchen?

Ja, kann man auch so machen. Nachteil ist das lineare Suchen im Vector. Wenn schon optimieren dann richtig. Der Speicherverbrauch einer Hashtable ist nur minimal grösser als der eines Vector. Und bei z.B. 10 Elementen dauert lineares ablaufen 5 Zeiteinheiten, Hashtable-zugriff aber nur eine.

cu