Я пытаюсь создать диаграмму эскизов некоторых данных с использованием JScrollPane
, но я сталкиваюсь с трудностями с производительностью. Этот пример содержит около 100 миниатюрных диаграмм с 5000 образцами в каждом из них. Когда я пытаюсь несколько раз прокручиваться и возвращаться в несколько раз, прокрутка происходит с задержкой, увеличением загрузки процессора, использованием памяти приложения до 500 Мб.Каков правильный способ создания эскизов?
Есть ли способ избежать этой проблемы с производительностью без сокращения моих данных?
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.ThermometerPlot;
import org.jfree.data.general.DefaultValueDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
public class ThumbnailChartsTest extends JPanel {
private static final int W = 200;
private static final int H = W;
private static final int N = 5000;
private static final Random random = new Random();
private static ChartPanel createPane() {
final XYSeries series = new XYSeries("Data");
for (int i = 0; i < random.nextInt(N) + N; i++) {
series.add(i, random.nextGaussian());
}
XYSeriesCollection dataset = new XYSeriesCollection(series);
JFreeChart chart = ChartFactory.createXYLineChart("Random", "Domain",
"Range", dataset, PlotOrientation.VERTICAL, false, false, false);
return new ChartPanel(chart, W, H, W, H, W, H,
false, true, true, true, true, true);
}
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(0, 4));
for (int i=0; i<100; i++){
panel.add(createPane());
}
JScrollPane scrollPane = new JScrollPane(panel,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
f.add(scrollPane);
f.pack();
f.setVisible(true);
}
});
}
}
Edit: Я не могу понять одну вещь: почему в этом случае использование памяти еще очень огромный! Посмотрите на эту иллюстрацию.
Дополнение Я думаю, что есть какое-то недоразумение.
Размер кучи на мониторе visualVM После запуска размер кучи апплета составляет всего 125 МБ, это круто. Но потом я начинаю тестирование: прокрутка и изменение размера несколько раз, все больше и больше - вверх и вниз, вверх и вниз, меньшая рамка и больший кадр. Куча размером более 500 Мб! Я полагаю, что эта ситуация не является нормальной.
Дополнение # 2
Реальный пример:
Мои данные имеют размер около всего 2 Мб и представлена в 90 графиках (2 серии в каждом), одна серия содержит 3000 элементов. Я реализовал изменение столбцов чисел с помощью ползунка.
Но для этого небольшого размера кучи данных растут более 1,5 ГБ!
Это происходит после того, как некоторые действия, изменяя число столбцов, например, Для моего процессора (ядро 2 дуэта 2,2 ГГц) каждая таблица чертежей занимает около 4 секунд! С этой большой задержкой трудно управлять слайдером.
обновление:
Я внедрено субдискретизации мои данные 100 выборок на диаграмме миниатюр. Теперь это определенно быстрее, но проблема с огромным размером кучи все еще там. На картинке выше 700 Мб, и это не рекорд. Я разочарован.
Я не могу понять одну вещь: почему в этом случае использование памяти по-прежнему очень огромный! Посмотрите на эту иллюстрацию - [link] (https://s14.postimg.org/kvg4q7bup/memory_Usage.png) Как уменьшить использование памяти до небольших значений? –
Я разработал выше. – trashgod
Но почему рост памяти растет? После запуска апплета он не большой, менее 200 Мб, но после прокрутки, изменения размера и т. Д. Использование памяти достигает значений более 600 Мб. Зачем? –