C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: JFreeChartのグラフ処理


(過去ログ 27 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■12455 / inTopicNo.1)  JFreeChartのグラフ処理
  
□投稿者/ T.T (1回)-(2008/01/09(Wed) 21:29:12)

分類:[Java] 

JFreeChart
お願いします。
JBuilder
JDK1.4.2

JFreeChartを用いてCPU使用率みたいな、リアルタイムのグラフを作成しております。
グラフ表示も右から左へ遷移していく動作です。

周期は1秒周期で以下のことを行っています。
X軸は120プロット(2分)
Y軸は0〜3
1秒間隔で値を取得し、
xySeriesをClearし、
経過時間に分をaddする繰り返し、
Repaintします。
ちなみにグラフの表示はimegeで行っています。
また120プロットつまり2分以上は常に120プロット表示なので
1秒おきにClearし、120回add、Repaintをしています。

この処理を1時間くらい繰り返していくと
グラフの遷移が非常に遅くなります。
調べたところ120回addするLoop部分で
開始時は数ミリで処理をしていたのにも関わらず
5秒ぐらいかかるようになってしまいます。

原因が全く分かりません。
XYSeriesではなく、TimeSeriesなど使用するのでしょうか?
addするXYSeriesのAllayListに負荷がかかっておりのでしょうか?

作成した事のある方、ご教授またはサンプルなどお願いいたします。

引用返信 編集キー/
■12470 / inTopicNo.2)  Re[1]: JFreeChartのグラフ処理
□投稿者/ mあ@反省中 (1回)-(2008/01/10(Thu) 02:21:00)
2008/01/10(Thu) 02:51:04 編集(投稿者)
2008/01/10(Thu) 02:29:19 編集(投稿者)

> 経過時間に分をaddする繰り返し、


http://sourceforge.net/tracker/?group_id=15494&atid=115494


ソースが無いのでよーわからんのですが、毎回いらんところで new Constructor()
していてGC効いてなくて重くなっているとか・・・と思ったが、以下のリンク先の
サンプル見るとおかしな部分は無さそうですね・・・



http://sourceforge.net/projects/jfreechart
最新版があがっているみたいですからまずはこいつで同一現象の再現をば。

http://www.urokutawazaneyo.com/?p=285
「ここ」に解説へのリンクが・・・

検索キーワード:
JFreeChart リアルタイム グラフ 表示

訂正:
でも上記サンプルって時間軸の範囲の設定が見当たらないなぁ・・・
どーやるんだろ?「ここ」見ればきっと詳しく解説してあるんだろね。

引用返信 編集キー/
■12479 / inTopicNo.3)  Re[2]: JFreeChartのグラフ処理
□投稿者/ T.T (2回)-(2008/01/10(Thu) 09:03:40)
簡単なサンプルですが
細かい変数は目をつぶってください。
スレッドにてClear->add->再描画の繰り返しで行ってます。

// Seriesにデータを追加処理部分
// グラフをリフレッシュ
xy_Series[i_Loop][0].clear();

for(int i_PlotLoop = 0 ; i_PlotLoop < i_MaxCap ; i_PlotLoop++){

// plotする位置を算出
i_xPlotPos = i_Max - (i_MaxCap - i_PlotLoop);
// 取得位置からインクリメント
i_GetPosCacu = i_GetPos + i_PlotLoop;

//i_GetPosCacuが121以上になったら0にする
if(i_GetPosCacu >= i_MaxCap){
i_GetPosCacu = i_GetPosCacu - i_MaxCap;
}

xy_Series[i_Loop][0].add(i_xPlotPos, i_recieve);
xy_Series[i_Loop][1].add(i_xPlotPos, 0);
}
}

//グラフ表示部分

public BufferedImage v_Chart_SeriesCollection()
{

JFreeChart chart =
ChartFactory.createXYLineChart("表示",
"時間[sec]","受信状態",t_plot_data,PlotOrientation.VERTICAL,
true,
true,
false // Show legend
);

XYPlot plot = (XYPlot)chart.getPlot();

// 軸の間隔をINT型であらわす
NumberAxis rangeAxis = (NumberAxis)plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
rangeAxis.setAutoRangeIncludesZero(true);

/* 横軸の設定 */
ValueAxis xAxis = plot.getDomainAxis();
xAxis.setAutoRange(false);
xAxis.setRange(0,DataBase.i_xMaxPlot);
plot.setDomainGridlinePaint(DataBase.cl_Line);
plot.setDomainGridlinesVisible(true);

//横軸の目盛り間隔の設定
TickUnits tickUnits = new TickUnits();
TickUnit unit = new NumberTickUnit(10);
tickUnits.add(unit);
xAxis.setStandardTickUnits(tickUnits);
xAxis.setTickLabelsVisible(false); // メモリ値を隠す

//
plot.setAxisOffset(new RectangleInsets(5,5,5,5));

/* 縦軸の設定 */
ValueAxis yAxis = plot.getRangeAxis();
yAxis.setAutoRange(false);
yAxis.setRange(0, DataBase.i_yMaxPlot);

//背景色の設定
plot.setRangeGridlinePaint(DataBase.cl_Line);
plot.setBackgroundPaint(DataBase.cl_back);

// 凡例背景の設定
chart.getLegend();
chart.getLegend().setBackgroundPaint(ChartColor.lightGray);
chart.getLegend().setItemPaint(ChartColor.BLACK);

//レンダラの初期化
DataBase.xy_renderer = (XYLineAndShapeRenderer)plot.getRenderer();
for(int i_Loop = 0 ; i_Loop < 2 ; i_Loop++){
DataBase.xy_renderer.setSeriesPaint(i_Loop*2,DataBase.cls_SystemData[i_Loop].cl_Line_org);
DataBase.xy_renderer.setSeriesPaint(i_Loop*2+1,DataBase.cls_SystemData[i_Loop].cl_Line_rpt);
//データポイントにプロットする
DataBase.xy_renderer.setSeriesShapesVisible(i_Loop*2,true); // マーキング
DataBase.xy_renderer.setSeriesShapesVisible(i_Loop*2+1,true);// マーキング
}

//チャートサイズ
image = chart.createBufferedImage(850,190);
}

//スレッドで実行している部分です
public void run(){

while(!b_run_stop){

try {

// false:falseなら実行
if (!b_run_suspend && !b_run_stop) {

Seriesにデータを追加部分処理

//描画
mainframe.jp_moni.revalidate();
mainframe.jp_moni.updateUI();
}

// SLEEP
Thread.sleep(DataBase.l_sleep);

synchronized (this) {
while (b_run_suspend && !b_run_stop) {
wait();
}
}
}
}

引用返信 編集キー/
■12492 / inTopicNo.4)  Re[3]: JFreeChartのグラフ処理
□投稿者/ T.T (3回)-(2008/01/10(Thu) 12:30:22)

XYPlotクラスとJFreeChartクラスのnewを1秒周期で行っていたのですが、あるクラスのコンストラクタでnewを1回のみにしたら
安定しました。
mあ@反省中さんの言うとおりGCで処理が遅くなったのでしょうか?
結果的には安定しました、お手数かけました。
ただどうやって原因追求すればいいか何か方法はあるのでしょうか?

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -