У меня проблема с java OutOfMemoryError. Программа в основном рассматривает таблицы mysql, которые работают в workbench mysql, и запрашивает их для получения определенной информации, а затем помещает их в файлы CSV.OutOfMemoryError: Java heap space
Программа работает очень хорошо с меньшим набором данных, но как только я использую больший набор данных (часы записи данных в отличие от, возможно, 40 минут), я получаю эту ошибку, которая для меня говорит о том, что проблема связана с тем, что огромный набор данных и информация, которую программа не слишком хорошо обрабатывает. Или невозможно обрабатывать этот объем данных так, как я есть.
Настройка аргументов Java VM на -xmx1024m работала для немного большего набора данных, но мне нужно, чтобы он обрабатывал еще большие, но при этом дает ошибку.
Вот метод, который я совершенно уверен, что является причиной этой программы где-то:
// CSV is csvwriter (external lib), sment are Statements, rs is a ResultSet
public void pidsforlog() throws IOException
{
String[] procs;
int count = 0;
String temp = "";
System.out.println("Commence getting PID's out of Log");
try {
sment = con.createStatement();
sment2 = con.createStatement();
String query1a = "SELECT * FROM log, cpuinfo, memoryinfo";
rs = sment.executeQuery(query1a);
procs = new String[countThrough(rs)];
// SIMPLY GETS UNIQUE PROCESSES OUT OF TABLES AND STORES IN ARRAY
while (rs.next()) {
temp = rs.getString("Process");
if(Arrays.asList(procs).contains(temp)) {
} else {
procs[count] = temp;
count++;
}
}
// BELIEVE THE PROBLEM LIES BELOW HERE. SIZE OF THE RESULTSET TOO BIG?
for(int i = 0; i < procs.length; i++) {
if(procs[i] == null) {
} else {
String query = "SELECT DISTINCT * FROM log, cpuinfo, memoryinfo WHERE log.Process = " + "'" + procs[i] + "'" + " AND cpuinfo.Process = " + "'" + procs[i] + "'" + " AND memoryinfo.Process = " + "'" + procs[i] + "' AND log.Timestamp = cpuinfo.Timestamp = memoryinfo.Timestamp";
System.out.println(query);
rs = sment.executeQuery(query);
writer = new CSVWriter(new FileWriter(procs[i] + ".csv"), ',');
writer.writeAll(rs, true);
writer.flush();
}
}
writer.close();
} catch (SQLException e) {
notify("Error pidslog", e);
}
}; // end of method
Пожалуйста, не стесняйтесь спросить, если вы хотите, исходный код или больше информации, как я в отчаянии, чтобы получить это фиксированное !
Спасибо.
Вы пытались использовать [профилировщик] (http://profiler.netbeans.org/)? – user000001
Не можете ли вы передать результаты из базы данных в файл, не имея сразу все в памяти? – kutschkem
'writer.close()' i.o. заподлицо (внутри петли). Много возможностей улучшить код; нанять программиста. –