JScrollPane
을 사용하여 일부 데이터의 미리보기 이미지 차트를 만들려고하는데 성능 문제가 있습니다. 이 예제에는 각각 약 5000 개의 샘플이있는 약 100 개의 축소판 차트가 있습니다. 아래로 스크롤하여 여러 번 위로 이동하려고하면 스크롤이 지연되고 CPU로드가 증가하며 응용 프로그램 메모리 사용량이 500MB를 초과합니다.썸네일 차트를 만드는 올바른 방법은 무엇입니까?
데이터를 축소하지 않고도 성능상의 문제가 발생하지 않도록 할 수 있습니까?
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);
}
});
}
}
편집 : 나는 한 가지를 이해할 수 없다 : 왜이 경우 메모리 여전히 사용이 매우 큰에서! 이 그림을보십시오.
추가 : 나는 약간의 오해가 있다고 생각합니다.
힙 크기 by monitor visualVM 시작 애플릿 힙 크기는 125Mb에 불과하므로 시원합니다. 하지만 이제는 테스트를 시작합니다. 여러 번 스크롤하고 크기를 조정하고, 위아래로, 위아래로, 더 작은 프레임과 더 큰 프레임으로 크기를 조정합니다. 힙 크기는 500Mb 이상 증가합니다! 나는이 상황이 정상이 아니라고 생각한다.
추가 # 2
실제 예제 :
내 데이터는 2 메가에 대한 크기와 90 개 차트에 표현 (각각 2 시리즈)가 하나의 시리즈는 3000 개 요소가 포함되어 있습니다. 슬라이더로 숫자 열을 변경하여 구현했습니다.
그러나이 작은 데이터 힙 크기는 1.5GB 이상 증가합니다!
이것은 예를 들면 숫자 열을 변경, 일부 작업 후 발생 내 CPU (코어 2 듀오 2.2GHz)의 경우 모든 드로잉 테이블에 약 4 초의 시간이 걸립니다! 이 큰 지연으로 슬라이더를 제어하기가 어렵습니다.
갱신 :
내가 썸네일 차트 당 100 개 샘플 내 데이터를 다운 샘플링을 구현했습니다. 지금은 확실히 빠르지 만, 여전히 큰 힙 크기에는 문제가 있습니다. 그림에서 700Mb 이상이고 기록이 아닙니다. 나는 좌절했다.
나는 한 가지를 이해할 수 없다 : 왜이 경우 메모리 사용량이 여전히 매우 큰! 이 그림을 참고하십시오 - [link] (https://s14.postimg.org/kvg4q7bup/memory_Usage.png) 어떻게 메모리 사용량을 작은 값으로 줄이려고합니까? –
나는 정교했다. – trashgod
그러나 왜 메모리 사용량이 자라고 있습니까? 애플릿을 시작한 후에는 200 Mb보다 크지 않지만 스크롤 한 후에는 메모리 사용량이 600 Mb 이상의 값에 도달합니다. 왜? –