Hi,
ich würde gerne auf meiner Postgresdatenbank ein paar Performancetests durchführen.
Deshalb hab ich erstmal ca 300000 Datensätze generiert. Die habe ich dann in ein csv-Format geparst, da Postgres von csv-Files direkt einen Bulkload in eine Tabelle machen kann.
Ein Problem ergibt sich jedoch, wenn ich anstatt der 300000 Datensätze nun 3 Millionen Datensätze generieren will:
Der Fehler tritt deshalb auf, weil die Treesets einfach zu viele Knoten haben. Bei ca 400000 Knoten wirds der VM zu viel. Gibts ne elegantere Methode sowas zu handeln? Kann ja schlecht 10 mal so viel HeapSpace reservieren (falls das überhaupt geht), außerdem ist das Ganze sogar mit TreeSets ab ca 14% nicht mehr wirklich performant, was vielleicht auch an meienm Rechner liegen mag. Ich brauch die Treesets(oder was vergleichbares) jedoch, da ich sonst Doppelte PrimaryKeys habe.
//edit:
auch ohne den treesets wirds der VM anscheinend zu viel. Der Fehler tritt aber immer noch an der selben Stelle auf:
ich würde gerne auf meiner Postgresdatenbank ein paar Performancetests durchführen.
Deshalb hab ich erstmal ca 300000 Datensätze generiert. Die habe ich dann in ein csv-Format geparst, da Postgres von csv-Files direkt einen Bulkload in eine Tabelle machen kann.
Ein Problem ergibt sich jedoch, wenn ich anstatt der 300000 Datensätze nun 3 Millionen Datensätze generieren will:
Code:
public static void main(String[] args) {
Random rand = new Random();
TreeSet<Integer> idxTree = new TreeSet<Integer>();
TreeSet<String> nickTree = new TreeSet<String>();
//ArrayList<Integer> idxArray = new ArrayList<Integer>();
//ArrayList<String> nickArray = new ArrayList<String>();
Integer index = null;
StringBuilder sb = new StringBuilder();
String newLine = System.getProperty("line.separator");
String nickname = null;
try {
FileOutputStream fout = new FileOutputStream("records.csv");
PrintStream ps = new PrintStream(fout);
for (int j = 0; j < 100; j ++){
for (int i = 0; i < 30000; i++){
index = rand.nextInt(1000000);
if (!idxTree.contains(index)){
.... ein paar StringBuilder.append() 's
//index
idxTree.add(index);
.... ein paar StringBuilder.append() 's
while(nickTree.contains(nickname = Main.genWord(rand)));
nickTree.add(nickname);
.... ein paar StringBuilder.append() 's
}
}
System.gc(); //versuchsweise GarbageCollector anstupsen
String temp = sb.toString(); //HIER java.lang.OutOfMemoryError!
ps.print(temp);
ps.flush();
fout.flush();
System.out.println(new Integer((j+1)).toString() + "Percent...");
System.out.println("current length of StringBuilder: " + sb.length());
sb = new StringBuilder();
}
fout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//edit:
auch ohne den treesets wirds der VM anscheinend zu viel. Der Fehler tritt aber immer noch an der selben Stelle auf:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.String.<init>(String.java:208)
at java.lang.StringBuilder.toString(StringBuilder.java:431)
at Main.main(Main.java:127)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)