Großes Hash-Set erzeugen

RungetSvohu

Bekanntes Mitglied
Hallo Leute,

ich muss zu Programmstart eine große Menge an Strings in ein HashSet<String> laden, über 1.000.000. Derzeit habe ich die Strings alle in einer txt-Datei gespeichert, jede Zeile einen. Dann lese ich sie über
Java:
eader = new RandomAccessFile(file, "r");
zeilenweise ein. Der ganze Vorgang dauert mehrere Minuten. Kann man das irgendwie beschleunigen, indem ich die Daten anders abspeichere und anders einlese?

Vielen Dank!
 
Zuletzt bearbeitet:
Obwohl RandomAccessFile ja glaub ich super schnell ist, wo liegt der Sinn darin wenn du eh sequentiell die Datei einmal durchläufst?
 
Kann auch sein, dass die HashMap mit einem zu kleinen Wert instantiiert wird, und die Map immer vergrößert und reorganisiert werden muss..
 
Ich lese so ein:

Java:
reader = new RandomAccessFile(file, "r");
String line;
while ((line = reader.readLine()) != null) {
strings.add(line);

Ich glaube aber, dass die meiste Zeit nicht beim Einlesen verloren geht, sondern beim Einfügen in die HashSet, da muss er ja jedes Mal überprüfen, ob was doppelt ist oder nicht.
 
Zuletzt bearbeitet:
Ich glaube aber, dass die meiste Zeit nicht beim Einlesen verloren geht, sondern beim Einfügen in die HashSet
Das kannst du durch ein paar Sysouts doch sehr genau feststellen.

Das einfügen von 2 Millionen (unterschiedlichen) Strings in ein Set dauert bei mir jedenfalls nur knapp 4 Sekunden.
 
Versuchs mal über:
[JAvA]
BufferedReader br = null;
try
{
FileReader fr = null;
try
{
fr = new FileReader("....");
br = new BufferedReader(fr);
String line;

while((line = br.readLine()) != null)
{
?.add(line)
}
}
finally
{
if(fr != null)
{
fr.close();
}
}
}
finally
{
if(br != null)
{
br.close();
}
}
[/code]

Alternativ würde ich mal eine Liste verwenden / einfach nur aus der Datei lesen
(nur zum Test was da so lange dauert)
 
Versuchs mal über:
[JAvA]
BufferedReader br = null;
try
{
FileReader fr = null;
try
{
fr = new FileReader("....");
br = new BufferedReader(fr);
String line;

while((line = br.readLine()) != null)
{
?.add(line)
}
}
finally
{
if(fr != null)
{
fr.close();
}
}
}
finally
{
if(br != null)
{
br.close();
}
}
[/code]

Alternativ würde ich mal eine Liste verwenden / einfach nur aus der Datei lesen
(nur zum Test was da so lange dauert)

Das ist im Prinzip normales einlesen, mit dem Zusatz das das doppelte schließen der verschachtelten Reader sinnlos sein dürfte, close von BufferedReader sieht nämlich so aus:
Java:
public void close() throws IOException {
	synchronized (lock) {
	    if (in == null)
		return;
	    in.close();
	    in = null;
	    cb = null;
	}
    }

Der innere Stream wird also sowieso geschlossen, es reicht den äußeren zu schließen.
Gruß
 
Versuchs mal über:
[JAvA]
BufferedReader br = null;
try
{
FileReader fr = null;
try
{
fr = new FileReader("....");
br = new BufferedReader(fr);
String line;

while((line = br.readLine()) != null)
{
?.add(line)
}
}
finally
{
if(fr != null)
{
fr.close();
}
}
}
finally
{
if(br != null)
{
br.close();
}
}
[/code]

Alternativ würde ich mal eine Liste verwenden / einfach nur aus der Datei lesen
(nur zum Test was da so lange dauert)


Vielen Dank, habe erst einmal einfach die Zeile
Java:
strings.add(line);
auskommentiert und Zeit gestoppt. Mit der Zeile dauerte es 68802 ms, ohne 68050 ms. Meine Vermutung war also falsch und das Problem lag eindeutig beim Einlesen der Datei. Mit dem BufferedReader + FileReader dauert die ganze Sache nun 465 ms ohne
Java:
strings.add(line);
und 1550 ms mit der Zeile. Damit bin ich auf jeden Fall zufrieden. Vielen Dank!
 

Zurück
Oben