Sto cercando di eseguire una query di PostgreSQL che restituisce un grande risultato:JDBC + PostgreSQL query di grandi dimensioni danno di memoria
connection.setAutoCommit(false);
st = connection.createStatement(
ResultSet.CONCUR_READ_ONLY,
ResultSet.TYPE_FORWARD_ONLY
);
st.setFetchSize(100);
logMemory();
System.out.println("start query ");
rs = st.executeQuery(queryString);
System.out.println("done query ");
logMemory();
ma questo utilizza un sacco di memoria:
Free memory; 4094347680 (= 3905 mb).
start query
done query
Free memory; 2051038576 (= 1956 mb).
(stampato con Runtime.getRuntime(). freeMemory())
Finora funziona, ma il database sarà molto più grande. Non ho mai bisogno dell'intero risultato in memoria; Ho solo bisogno di processare ogni riga, scrivere i risultati su disco e andare alla riga successiva.
So che "setFetchSize" è solo un suggerimento, ma lo troverei strano se postgresql/jdbc lo ignorasse, visto che esiste da anni.
Un modo per aggirare questo? La mia unica idea è quella di creare uno script batch che trasmetta il risultato della query su disco e quindi analizzare il file da Java ...
Solo curioso, qual è la dimensione massima dell'heap con cui stai lavorando? O stai usando il default? –
È -Xmx4096M -Xms4096M, è una macchina da 8 GB con vista. – kresjer