2011-08-30 2 views
1

나는 100,000 개가 넘는 레코드가있는 2 차원 배열을 가지고 있습니다. 내가 차트를 만들려고 할 때 - CPU가 하드 로딩 중이며 그 밖의 일은 일어나지 않습니다. 앤티 앨리어싱, 이벤트 리스너 사용 안 함 등 모든 가능한 방법을 확인했습니다. 아무것도 작동하지 않습니다. 3 분에서 5 분 정도의 공연을 가정합니다. (좋아요, 상대적인 것이지만 도달 방법을 알고 싶습니다).JFreeChart에서 거대한 데이터 세트 표시

따라서 데이터를 올바르게 표시 할 수있는 방법이 있는지 묻고 싶습니다. 나는 차트를 지정하기위한 두 가지 기능을 가지고있어, 그리고 또 다른 음모를 꾸미고 있어요 :

public void plotXYChart(double dArray[][], String sPlotName, String sSeriesName, 
     String sRangeName){ 
    XYSeries series1 = new XYSeries(sSeriesName); 
    series1.clear(); 
    for (int i=0; i< dArray.length; i++){ 
     series1.add(dArray[i][0], dArray[i][1], false); 
    } 
    XYSeriesCollection dataset = new XYSeriesCollection(); 
    dataset.removeAllSeries(); 
    dataset.addSeries(series1); 
    dataset.setAutoWidth(false); 
    dataset.setIntervalWidth(2000); 

    chart = ChartFactory.createXYLineChart(sPlotName, sSeriesName, sRangeName, 
      dataset, PlotOrientation.VERTICAL, false, 
      true, false); 

    chart.setAntiAlias(false); 
    XYPlot plot = (XYPlot) chart.getPlot(); 
    plot.getDomainAxis().setStandardTickUnits(new StandardTickUnitSource()); 
    plot.getRangeAxis().setStandardTickUnits(new StandardTickUnitSource()); 

    SamplingXYLineRenderer renderer = new SamplingXYLineRenderer(); 
    plot.setRenderer(renderer); 
    plotChart(sPlotName, chart); 
} 

    private void plotChart(String sPlotName, JFreeChart chart){ 

    if (this.cPanel!=null) 
     cPanel.setChart(chart); 
    else 
     cPanel = new ChartPanel(chart); 

    cPanel.setAutoscrolls(false); 
    cPanel.setDomainZoomable(false); 
    cPanel.setRangeZoomable(false); 
    cPanel.setRefreshBuffer(false); 
    cPanel.setDoubleBuffered(rootPaneCheckingEnabled); 
    this.chartFrame.add(cPanel); 
    this.chartFrame.pack(); 
    if (this.chartFrame.isVisible() == false) 
     RefineryUtilities.centerFrameOnScreen(this.chartFrame); 
    this.chartFrame.setVisible(true); 

} 
+2

하나의 차트에 100k 비트의 데이터를 완전 정밀도로 표시하는 것이 가능하지 않으며, 평균화 또는 다른 방법으로 데이터를 제한하는 경우 동일한 차트가 표시됩니다. 훨씬 짧은 기간에 또한 병목 현상이 정확히 어디에서 발생했는지 확인하기 위해 프로그램을 프로파일 링 했습니까? –

+0

표시하는 동안 (어쩌면 스케일링), 나머지는 모두 정상적으로 실행됩니다. 문제는 크기가 조정되고 원본 크기의 데이터로 작업해야하기 때문에 자동으로 크기를 조정하는 것이 바람직합니다. – wanderlust

답변

3

그것은 JFreeChart가 문제가 아니다. 너무 많은 데이터를 그리기 만하면됩니다. 스윙과 함께 100k 라인을 그리려고한다면 같은 퍼포먼스 문제를 느낄 것입니다. 데이터 집합을 줄입니다.

해결 방법을 시도해 볼 수도 있지만 제대로 작동하는지 확신 할 수 없습니다. 생성 된 ChartPanel을 표시하지 않습니다. 대신 다음을 사용하여 ChartPanel 이미지를 생성하십시오.

Image image = chartPanel.createImage(); 

생성 된 이미지를 원하는 구성 요소 안에 표시하십시오. 이미지 생성 시간은 상당히 길 수 있지만 일단 생성되면 이미지를 빠르게 표시하고 이미지가 저장되는 구성 요소의 크기를 조정해야합니다. 이는 정적 이미지이기 때문에 그리기 프리미티브는 표시되는 동안 호출되지 않습니다. 물론이 방법을 사용하면 모든 ChartPanel 함수를 풀고 이미지 만 가져옵니다.

1

렌더링 작업을 최소화하려면 을 참조하십시오 (here 참조).

부록 : 또는 here과 같이 데이터의 관리 가능한 부분을 볼 수 있도록 페이지 할 수 있습니다.