Index File bauen

student1

Mitglied
Hi,
Ich hab folgendes Problem:
Ich habe eine ganz große Datei mit viel Text. Für diese will ich ein Index File erstellen. Jedes Wort aus meiner Datei speichere ich in eine Map als KeyWert ab und als ValueWert speichere ich die Position des Wortes (getFilePointer()).
In einem Text kommen gleiche KeyWerte öfters vor, d.h. der KeyWert braucht als ValueWert mehrere Werte (z.B. key= halloo value=[1,5,7,9,10])
Ich krieg das für eine kleinere Textdatei hin, aber wenn sie ganz groß ist, dauert es viel zu lange, bis die indices gebaut werden.

Festgestellt habe ich, das vor allem dieser Code viel Zeit braucht:
Java:
id.add(offset);

Wenn ich den weglasse, geht alles schneller, aber mir fehlen dann ValueWerte,die ich brauche.
Jemand einen Vorschlag?
Danke.



Java:
public void indexFile(String file) {
       
       
        Map<String, Set<Long>> indexMap = new HashMap<String, Set<Long>>();
       

        try {
            RandomAccessFile readIn = new RandomAccessFile(file, "r");
            String line;

            while ((line = readIn.readLine()) != null) {

                long offset = readIn.getFilePointer();
                String delims = "[ .,?!]+";
                String[] terms = line.toLowerCase().split(delims);
                int k = 0;
                while (k < terms.length) {
                    if (stopwords.contains(terms[k])) {
                        k++;
                        continue;
                    } else {
                        if (line.length() == 0
                                || line.startsWith("---------------------")) {
                            k++;
                            continue;
                        }

                        else {
                            Set<Long> idList = new HashSet<Long>();
                            if (idList.size() == 0)
                                idList.add(offset);

                            if (indexMap.containsKey(terms[k])) {
                                Set<Long> id = new HashSet<Long>();

                                id.addAll(indexMap.get(terms[k]));
                                id.add(offset);

                                indexMap.put(terms[k], id);
                                k++;
                            } else {
                                indexMap.put(terms[k], idList);
                                k++;
                            }
                        }
                    }
                }
            }

            readIn.close();

            RandomAccessFile indexedFile = new RandomAccessFile("index.txt",
                    "rw");
            int n = 0;
            Object[] key = indexMap.keySet().toArray();
            Object[] values = indexMap.values().toArray();
            while (n < indexMap.size()) {
                indexedFile.write(key[n].toString().getBytes());
                indexedFile.write(";".getBytes());
                indexedFile.write(values[n].toString().getBytes());
                indexedFile.write("\n".getBytes());
                n++;
            }

            indexedFile.close();

        } catch (Exception e1) {

            e1.printStackTrace();
        }

    }
 

mrBrown

Super-Moderator
Mitarbeiter
Wenn ichs richtig sehe, ist der ganze Block

Java:
else{
    Set<Long> idList=new HashSet<Long>();
     if(idList.size()==0)
      idList.add(offset);

      if(indexMap.containsKey(terms[k])){
          Set<Long> id =new HashSet<Long>();

           id.addAll(indexMap.get(terms[k]));
           id.add(offset);

           indexMap.put(terms[k], id);
           k++;
    }else{
          indexMap.put(terms[k], idList);
          k++;
    }
}

nur dazu da, den entsprechenden Wert der Liste der Map hinzuzufügen?


Dein Set id ist überflüssig, ein Set existiert ja schon in der Map. Du überträgst alle aus dem existierendem Set in dein neues, fügst da einen Wert hinzu, und schmeißt dann das existierende Weg.Du könnest einfach gleich dem existierenden hinzufügen, musst dann nur dafür sorgen, dass immer eins existiert.

Das ginge zB recht kurz, wenn du putIfAbsent nutzt, mit get das Set für den Wert holst, und dem den neuen Wert hinzufügst.
 

student1

Mitglied
Also erstmal danke für die Antwort!
Ich verstehe leider nicht ganz wie ich deinen Gedanken umsetzen soll.
Ich hab den Code ein bisschen aufgeräumt und Set Id entfernt.

Mit dem Block den du meinst, wollte ich einfach schauen, wenn ein Key Wert schon in meiner HashMap vorhanden ist, dann ist das ja so, dass der KeyWert eindeutig ist.
Ich muss mir aber merken, an welchen Stellen der gleiche KeyWert immer auftaucht.
Also Map<KeyWert, Set = alle Positionen wo der KeyWert auftaucht>


Java:
   for (String terms : line.split(delims)) {
           String term = terms.toLowerCase();
           if (stopwords.contains(term) || line.length() == 0
               || line.startsWith("---------------------")) {
             continue;
           } else {
             Set<Long> idList = new HashSet<Long>();
             if(idList.size()==0)
              idList.add(offset);
          
             //idList.add(offset);
             indexMap.putIfAbsent(term, indexMap.get(term));
          
          
           }
         }
       }
 

mrBrown

Super-Moderator
Mitarbeiter
Sowas wie

Java:
indexMap.putIfAbsent(term, new HashSet<>());
indexMap.get(term).add(offset);

Oder das gleiche in anders:

Java:
Set<Long> idList = indexMap.get(term)
if (idList == null) {
    idList = new HashSet<>();
    indexMap.put(term, idList);
}
idList.add(offset);
 

student1

Mitglied
Danke. Das funktioniert wieder ganz gut für eine kleinere textdatei, aber für die eigentliche, die 400Mb groß, rechnet mein Computer immer noch. Siehst du noch irgendwas, was man optimieren kann? Wären andere Datenstrukturen besser?

P.S. Speicherverbrauch ist bei 4.55GB
 
Zuletzt bearbeitet:

Joose

Top Contributor
Ausgehend von dem Code in 1.Post

Folgende if-Bedingung kannst du direkt am Anfang der while-Schleife stellen
Java:
if (line.length() == 0 || line.startsWith("---------------------")) {
  k++;
  continue;
}
Grund: Wenn du eine Zeile in x Teile splittest, dann prüfst du x mal ob die Zeile übersprungen werden kann -> unnötig

Statt der inneren while-Schleife verwende einfach die erweiterte for-Schleife, dadurch ersparst du dir immer k++ und den Zugriffs aufs Array
Code:
for(String term : terms) {
   if (stopwords.contains(term)) {

Du erstellst bei jedem Wort ein neues HashSet und prüfst ob dieses leer ist. Ja das ist es, du hast es ja gerade erstellt ;) spar dir doch diese Überprüfung.
Außerdem erstellst du dieses neue HashSet immer, auch wenn für dieses Wort schon ein Eintrag exisitiert. Du musst nur ein neues erstellen wenn für dieses Wort noch kein Eintrag existiert.
Existiert schon ein Eintrag dann musst du den Offset doch nur zum existierenden HashSet hinzufügen und kein neues erstellen.

Mit diesen Änderungen kommt man zu folgenden Code:
Java:
while ((line = readIn.readLine()) != null) {
   // wenn zeile leer gar nicht weiter verarbeiten
   if (line.length() == 0 || line.startsWith("---------------------")) {
     continue;
   }
   long offset = readIn.getFilePointer();
   String delims = "[ .,?!]+";
   String[] terms = line.toLowerCase().split(delims);
   //foreach Schleife verwenden, um sich den Array zugriff zu sparen -> lesbarer und man muss nicht dran denken irgendeine zählvariable zu erhöhen
   for(String term : terms) {
     if (stopwords.contains(term)) {
       continue;
     } else {     
       if (indexMap.containsKey(term)) {
         Set<Long> id = indexMap.get(term); // existierendes HashSet für Wort holen
         id.add(offset);
       } else {
         Set<Long> idList = new HashSet<Long>(); // neues HashSet für Wort anlegen
         idList.add(offset);
         indexMap.put(term, idList);
       }
     }
   }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
Mugetsu35 ArrayList Update ohne Index Java Basics - Anfänger-Themen 6
Ostkreuz Zweidimensionaler Array Index Java Basics - Anfänger-Themen 2
_so_far_away_ Fehlermeldung "Index 2 out of bounds for length 2" Java Basics - Anfänger-Themen 7
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
P9cman Char Index rekursiv finden Java Basics - Anfänger-Themen 4
H Java verkettete Liste, Wert eines Index zurückgeben Java Basics - Anfänger-Themen 1
M Ersten Index von Array bestimmen Java Basics - Anfänger-Themen 14
M Wie kann eine Methode für ein vorhandenes "Array von char" einen Index-Wert zurückliefern? Java Basics - Anfänger-Themen 3
M Wie kann ich den Index i von einer LinkedList überprüfen? Java Basics - Anfänger-Themen 36
T Algorithmus für Index mit min-Wert Java Basics - Anfänger-Themen 2
H For-Schleife bis Index von Eingabe laufen lassen Java Basics - Anfänger-Themen 24
Y Knoten an einem gegebenen Index aus einer Liste entfernen. Java Basics - Anfänger-Themen 6
G Methoden Methode die aus einem Array ein Index ausgibt? Java Basics - Anfänger-Themen 2
Baktash Index 0 out of bounds for length 0 Java Basics - Anfänger-Themen 5
Lena_2611 Vergleich von Array1 Index mit Array2 Wert und erzeugen eines neues Arrays Java Basics - Anfänger-Themen 8
JD_1998 Vektorrechner; User Input -> Index out of bounds Java Basics - Anfänger-Themen 3
H Bei forEach Index des Elements ermitteln Java Basics - Anfänger-Themen 17
G Scanner nutzen und Index auslesen Java Basics - Anfänger-Themen 8
S String index out of range Java Basics - Anfänger-Themen 11
R Zugriff auf den Index eines Arrays, welches ein Objekt ist. Java Basics - Anfänger-Themen 4
J Apache Poi - createCell() Methode akzeptiert keinen Index aus for-schleife als Parameter Java Basics - Anfänger-Themen 4
J Fehler in Programm: Index -1 out of bounds for length 0 Java Basics - Anfänger-Themen 5
M Index of Array erweiteren Java Basics - Anfänger-Themen 24
R String index out of range: -1 beim Datei Parsen Java Basics - Anfänger-Themen 15
L gerader Index im Array Java Basics - Anfänger-Themen 8
A ArrayList - size() nur nach bestimmtem index anzeigen lassen Java Basics - Anfänger-Themen 13
P String index out of range Java Basics - Anfänger-Themen 12
F Arrays Sätze speichern und einzelne Worte mit Index Angabe auslesen Java Basics - Anfänger-Themen 4
M Index out of range Java Basics - Anfänger-Themen 10
I String index out of range Fehlermeldung Java Basics - Anfänger-Themen 4
D " Column Index out of range, 6 > 5." Java Basics - Anfänger-Themen 8
Z Array-Index einmalig je mit Random füllen Java Basics - Anfänger-Themen 7
Hacer remove at index Java Basics - Anfänger-Themen 31
M Kleinsten Index in Array finden Java Basics - Anfänger-Themen 6
S kleinster Index der größten Komponente ? Java Basics - Anfänger-Themen 3
K Element in ArrayList löschen ohne Index zu verschieben Java Basics - Anfänger-Themen 2
Z Erste Schritte String index out of range Java Basics - Anfänger-Themen 2
F Freier Index im Stringarray Java Basics - Anfänger-Themen 3
V Attribut aus aus jedem ArrayListen index auf Bildschirm ausgeben Java Basics - Anfänger-Themen 9
B Index out of bound exception. Warum? Java Basics - Anfänger-Themen 3
S string index out of range - es ergibt keinen Sinn Java Basics - Anfänger-Themen 6
E Arrayeintrag nach Index löschen und Array kürzen Java Basics - Anfänger-Themen 3
Ö Frage zu String index out of range: -1 Java Basics - Anfänger-Themen 12
T Index-Abfrage von Pi Java Basics - Anfänger-Themen 5
S Array - index von Benutzer eingegebenen char ausgeben Java Basics - Anfänger-Themen 3
X LinkedList - Index eines Objekts Java Basics - Anfänger-Themen 2
S Substring - String index out of range Java Basics - Anfänger-Themen 11
U buttonarray[this] anstatt buttonarray[index] ? Java Basics - Anfänger-Themen 12
D Annonyme Innere Klasse: Listen mit geradem Index ausgeben Java Basics - Anfänger-Themen 6
MiMa Array mit ungültigen Index ansprechen Java Basics - Anfänger-Themen 2
M Index einer JList ausgeben Java Basics - Anfänger-Themen 4
V Methoden Verkettete Listen Index eines Elementes ausgeben Java Basics - Anfänger-Themen 10
F Fehler bei Array und Index Programmierung Java Basics - Anfänger-Themen 18
T Erste Schritte Java ein Array Feld[index] zurueckgeben? Java Basics - Anfänger-Themen 20
Luk10 Index bei 2 verschachtelten Schleifen Java Basics - Anfänger-Themen 2
C Klassen BubbleSort was passiert mit dem Index ? Java Basics - Anfänger-Themen 2
S String index out of range: 8 at java.lang.String.substring(Unknown Source) Java Basics - Anfänger-Themen 13
E Array bei Index ändern Java Basics - Anfänger-Themen 14
O Index Ermittlung Java Basics - Anfänger-Themen 20
C Felder(Größte Zahl, Index) Java Basics - Anfänger-Themen 6
M kurze frage: Ohne index.of position von string angeben Java Basics - Anfänger-Themen 16
G Collections Liste mit festem Index Java Basics - Anfänger-Themen 16
R ArrayList(int index, Object) funktioniert nicht korrekt? Java Basics - Anfänger-Themen 7
H "Index" eines Button ermitteln Java Basics - Anfänger-Themen 7
K Fehlermeldung: java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 Java Basics - Anfänger-Themen 4
A dynamisches Array - Index Liste Java Basics - Anfänger-Themen 2
X Array Index Out of Bounds Java Basics - Anfänger-Themen 39
S Array bei index halbe umdrehen ohne hilfsfeld Java Basics - Anfänger-Themen 13
H String index out of range: 0 Java Basics - Anfänger-Themen 4
M index.html fehlt Java Basics - Anfänger-Themen 12
I Letzter Index einer Liste Java Basics - Anfänger-Themen 8
StupidAttack Fehler: String index out of range:7 Java Basics - Anfänger-Themen 10
C Datentypen ArrayList.remove(index) hinterlässt leeres Feld Java Basics - Anfänger-Themen 5
A Datentypen Nächsten freien index eines arrays finden Java Basics - Anfänger-Themen 5
S Enum als Index Java Basics - Anfänger-Themen 5
M JList Index selektieren ausschalten. Java Basics - Anfänger-Themen 7
S Sortierte LinkedList nach Variablen durchsuchen und nicht nach INDEX Java Basics - Anfänger-Themen 6
S Fehlermeldung String index out of range?? Java Basics - Anfänger-Themen 3
J arraylist Index des größten, zweit-,dritt-,...-größten Elemtens ausgeben Java Basics - Anfänger-Themen 8
B Array mit Index 1 starten lassen Java Basics - Anfänger-Themen 5
E Höherer Index als Size in ArrayList Java Basics - Anfänger-Themen 9
S Verschiedene Arrays über Index aufrufen Java Basics - Anfänger-Themen 5
M index of bei LinkedList Java Basics - Anfänger-Themen 6
DStrohma Index einer markierten Zeile aus einer JList bekommen? Java Basics - Anfänger-Themen 5
K itemlistener item index herausfinden Java Basics - Anfänger-Themen 4
P Array index per char suche auslesen Java Basics - Anfänger-Themen 3
J Array-Index nur als Integer möglich? Java Basics - Anfänger-Themen 15
H RemoteSocketAddress als Index von einem Array Java Basics - Anfänger-Themen 10
G Char erzeugen wenn Index bekannt! Java Basics - Anfänger-Themen 2
H wie spreche ich durch leerzeichen im string neuen index an Java Basics - Anfänger-Themen 10
F Arrays sortieren -> Index merken Java Basics - Anfänger-Themen 10
J Speichern des index Java Basics - Anfänger-Themen 3
J Array - Index ermitteln per Wert Java Basics - Anfänger-Themen 3
J Wie installiere ich die api index.html in meinen java editor Java Basics - Anfänger-Themen 4
E Array Index out of Bound Java Basics - Anfänger-Themen 5
E array index an methode übergeben? Java Basics - Anfänger-Themen 6
J enum Index Zugriff Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben