# Problem mit SAX



## spike78 (1. Sep 2006)

Hallo zusammen,

ich habe ein kleines Speicherproblem mit SAX. Und zwar lese ich eine XML Datei ein und will alle Elemente dieser Datei ein eine HashMap schreiben.

  EventMapref.put(event.getEventid(),event);

Nun habe ich aber leider Dateien mit ca. 160000 Elemente und das scheint die gute HashMap nicht zu schaffen. Bei ca. 150000 platzt mir der Speicher. Wie kann ich das lösen ?

Danke und Gruß

Michael


----------



## KSG9|sebastian (1. Sep 2006)

Du solltest ernsthaft drüber nachdenken ob eine XML-Datei das richtige ist für *160000* Elemente. XML-Dateien sind für "kleinere" Konfigurationsdinge u.s.w. sehr gut, wenn sie aber zu groß werden sind sie sowas von unperformant.


----------



## spike78 (1. Sep 2006)

Geht leider nicht. Ich bekomme meine Daten in diesem Format geliefert und muss nun leider damit leben ;(


----------



## AlArenal (1. Sep 2006)

KSG9|sebastian hat gesagt.:
			
		

> Du solltest ernsthaft drüber nachdenken ob eine XML-Datei das richtige ist für *160000* Elemente. XML-Dateien sind für "kleinere" Konfigurationsdinge u.s.w. sehr gut, wenn sie aber zu groß werden sind sie sowas von unperformant.



Die ANzahl der Elemente sollte irrelevant sein. Open Office und das neue MS Office nutzen XML-basierte Formate. Die können irhen Kunden wohl kaum sagen, doch bitte nur kleine Excel-Sheets zu erstellen und Word nur noch für kleine Briefe und nicht mehr für Bücher zu benutzen..


----------



## KSG9|sebastian (1. Sep 2006)

Ok..elemente ist unglücklich ausgedrückt 
Wenn die Dateien zu groß werden ist es verdammt langsam. Aber zurück zum Thema:

Wie parst du die Dateien? Wie sehen die Dateien aus?
Bissl code wäre nicht schlecht, und der Stacktrace wär auch ganz nett


----------



## spike78 (1. Sep 2006)

Also meine XML Datei sieht so aus:

<eventlist>
<event>
  <attribute type="AT_----">...</attribute>
  <attribute type="AT_----">...</attribute>
.
.
.
</event>

</eventlist>


Hier ein Teil vom Code:

Klasse 1)

```
import org.xml.sax.*;
import java.util.HashMap;
import java.util.ArrayList;

public class ZSAXParser extends org.xml.sax.helpers.DefaultHandler
{
    static HashMap EventMapout = new HashMap();
    static HashMap EventMapref = new HashMap();
    static double comAttrCnt;
    private ZEvent event;
    private String value;
    private String compareAttr;
    boolean switchFile;
    private double dummyKeyCnt;
    private String sdummyKeyCnt;
    private  ArrayList list;
    long iCnt;

    public ZSAXParser(String comAttr, boolean switsch){
        compareAttr = comAttr;
        switchFile = switsch;
        comAttrCnt=0;
        dummyKeyCnt =0;
        sdummyKeyCnt="";
    }

    public void startElement( String namespaceURI, String localName,

                              String qName, Attributes atts ) throws SAXException
    {
        int i;

        // Wenn das Element "event" gefunden wird, soll ein neuen Event Objekt erzeugt werden
        if(qName.equals("event")){
            event = new ZEvent(compareAttr);

        }

        // Attributwert setzen
            if(qName.equals("attribute")){
                findcompAttr=event.setKey(atts.getValue( 0 ));
            }
    }

    public void endElement( String namespaceURI, String localName, String qName )
    {
        //Attributende prüfen und Wert setzen
        if(qName.equals("attribute")){
            event.setValue(value);

        }

        // Elementende prüfen
        if(qName.equals("event")){
            event.setEventid();
        
        }
    }

    public void characters(char[] c, int start, int length)    throws SAXException
    {
        value = (new String(c, start, length));
    }

}
```
------------------------------------------------------------------------------------------------------------------------------

Klasse 2)


```
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


public class ZEvent
{
    private HashMap attributMap;
    private String key, value;
    private String eventid;
    private String comAttribut;
    private double comAttrCnt;

    ZEvent(String comAttr){
        attributMap = new HashMap();
        comAttribut = comAttr;
    }

    private void putEventinMap(){
       attributMap.put(key,value);
       value = null;
    }

    public boolean setKey(String sKey){
       key = sKey;
       if(sKey.equals(comAttribut)){
           comAttrCnt++;
           return true;
       }
       return false;
    }

    public void setValue(String sValue){
       value = sValue;
       putEventinMap();

   }

   public HashMap getattributMap(){
       return attributMap;
   }

   public void setEventid(){
       Iterator it = attributMap.entrySet().iterator();
       while(it.hasNext()){
           Map.Entry entry = (Map.Entry) it.next();
           if(entry.getKey().equals(comAttribut)){
               eventid = (String) entry.getValue();
               break;
           }
       }
   }

  public String getEventid(){
      return eventid;
  }
}
```


----------



## huckfinn (20. Sep 2006)

Hi,

1. Kannst du das mal  genauer auseinander nehmen! 
Wie genau soll die Speicherstrucktur aussehen.
So mal im Pseudocode.


```
ArrayList  event-list of Class Event {

          Event1 of Class {
               Key? 
               HashMap attributes 
         }

          Event2 of Class {
               Key? 
               HashMap attributes 
         }

        .......
     }
```

Ist das richtig? Ich frage das um raus zu bekommen was ist Key und 
was ist Datencontainer.

2. Ich würde bei großen Elementzahlen von der HashMap
absehen ..Bucketing Kollisionen etc. Falls du über einen 
Key zugreifen willst ist TreeMap erste Wahl und sucht auch 
schneller (AVL-Tree). 

3. Was tust du genau hier

```
public void setEventid(){
       Iterator it = attributMap.entrySet().iterator();
       while(it.hasNext()){
           Map.Entry entry = (Map.Entry) it.next();
           if(entry.getKey().equals(comAttribut)){
               eventid = (String) entry.getValue();
               break;
           }
       }
   }
```

reicht da nicht 
	
	
	
	





```
attributMap.get(comAttribut)
```
?


Als denne Huck


----------

