Hi,
ich rufe aus einer MySQL DB mehre Millionen Datensätze ab. Dabei wird dan Programm allmählich immer langsamer. Ein Test mit dem Profiler von NetBeans zeigt eine ständig wachsende Zahl an Surviving Genaration. Bei jedem GC Lauf wird es scheinbar eine mehr.
Soweit ich weiß deute das auf memory leaks hin (richtig?).
Ich habe schon die SQL Abfrage in einzelne Teile unterteilt (ich brauch die Daten sowieso nicht alle geleichzeitig sondern sequentiell). Das bringt keine Verbesserung. Hier der Code:
Den Aufruf der eigentlichen "Nutzmethode" habe ich mal rauskommentiert damit die als Ursache rausfällt.
Wie gesagt, "Used Heap" und "Surviving Generations" steigen und das Programm wird immer langsamer. Ich habe die Heapsize schon auf 1500mb vergrößert. Das bringt zwar Linderung, aber hier muß man doch prinzipiell was besser machen können.
MfG
Rol
ich rufe aus einer MySQL DB mehre Millionen Datensätze ab. Dabei wird dan Programm allmählich immer langsamer. Ein Test mit dem Profiler von NetBeans zeigt eine ständig wachsende Zahl an Surviving Genaration. Bei jedem GC Lauf wird es scheinbar eine mehr.
Soweit ich weiß deute das auf memory leaks hin (richtig?).
Ich habe schon die SQL Abfrage in einzelne Teile unterteilt (ich brauch die Daten sowieso nicht alle geleichzeitig sondern sequentiell). Das bringt keine Verbesserung. Hier der Code:
Java:
public void test() {
startDate = (Date) backtestGUI.startDateChooser.getDate();
endDate = (Date) backtestGUI.endDateChooser.getDate();
Connection con = Main.sampleFrame.historicalDatabase.con;
Statement stmt = null;
try {
stmt = con.createStatement();
} catch (SQLException ex) {
System.out.println("SQL Exception: " + ex.toString());
}
ResultSet rs = null;
int startTs = (int) (startDate.getTime() / 1000);
int endTs = (int) (endDate.getTime() / 1000);
int maxPerExecution = 500;
int startEx = startTs;
int endEx = startEx;
while (endEx < endTs) {
endEx = startEx + maxPerExecution;
if (endEx > endTs) {
endEx = endTs;
}
String SQL = "SELECT DISTINCT time, open, close, high, low FROM historicaldata WHERE symbol='foo' AND time >= " + startEx + " AND time < " + endEx + " ORDER BY time";
try {
stmt = con.createStatement();
} catch (SQLException ex) {
System.out.println("SQL Exception: " + ex.toString());
}
try {
rs = stmt.executeQuery(SQL);
} catch (SQLException ex) {
System.out.println("SQL Exception: " + ex.toString());
}
//hier wird eigentlich eine Methode aufgerufen und das resultSet übergeben...
//doSomething(rs);
//...aber auch ohne diese "Nutzleistung" steigen "Used Heap" und "Surviving Generations" stetig an.
startEx = endEx;
}
try {
stmt.close();
} catch (SQLException ex) {
System.out.println("Error while close stmt");
Logger.getLogger(BacktestEngine.class.getName()).log(Level.SEVERE, null, ex);
}
try {
rs.close();
} catch (SQLException ex) {
System.out.println("Error while close rs");
Logger.getLogger(BacktestEngine.class.getName()).log(Level.SEVERE, null, ex);
}
}
Den Aufruf der eigentlichen "Nutzmethode" habe ich mal rauskommentiert damit die als Ursache rausfällt.
Wie gesagt, "Used Heap" und "Surviving Generations" steigen und das Programm wird immer langsamer. Ich habe die Heapsize schon auf 1500mb vergrößert. Das bringt zwar Linderung, aber hier muß man doch prinzipiell was besser machen können.
MfG
Rol
Zuletzt bearbeitet von einem Moderator: