JScrollPane
を使用して一部のデータのサムネイルのチャートを作成しようとしていますが、パフォーマンスに問題があります。この例には、約100個のサムネイルチャートがあり、それぞれに5000個のサンプルがあります。私が何回もスクロールダウンしようとすると、スクロールが遅れて発生し、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);
}
});
}
}
編集:私は一つのことを理解することはできません。なぜ、この場合のメモリ使用量がまだ非常に巨大な!このイラストを見てください。
追加: 私はいくつかの誤解があると思います。
モニターによるヒープサイズ 開始アプレットのヒープサイズはわずか125 Mbですが、それはクールです。 しかし、私はテストを開始しています:スクロールとサイズ変更、複数回、上下、上下、小さなフレーム、大きなフレーム。ヒープサイズは500Mb以上に成長!この状況は普通ではないと思います。
加算#2
実際の例:私のデータのみを2メガビット程度のサイズを持っており、90枚のチャート(各1中2シリーズ)で表さ
、1シリーズは3000個の要素が含まれています。私はスライダーで番号の列を変更する実装しました。
しかし、この小さなデータのヒープサイズは1.5 GB以上になります。
これは例えば数値列を変更する、いくつかのアクションの後に起こります 私のCPU(コア2デュオ2.2GHz)では、すべての描画テーブルに約4秒かかります!この大きな遅れでスライダーをコントロールするのは難しいです。
更新:
私は、サムネイルチャートあたり100個のサンプルに私のデータをダウンサンプリング実装しました。 これは間違いなく高速ですが、HUGEヒープサイズの問題は依然として存在します。写真では700Mb以上で、それは記録ではありません。私はイライラしています。
私は一つのことを理解することはできません。なぜこのような場合のメモリ使用量がまだ非常に巨大な!この図を見てください - [リンク](https://s14.postimg.org/kvg4q7bup/memory_Usage.png)メモリ使用量を小さな値に減らすには? –
私は上記で詳しく述べました。 – trashgod
しかし、なぜメモリ使用量が増えていますか?アプレットを起動した後は、200 MB未満ではなく、スクロール後にサイズ変更などのメモリ使用量が600 Mb以上の値に達します。どうして? –