FlexView

Q12 20
FlexView処理におけるメモリ消費削減
[内容]
for文などのループ内でGetRow()を行うと、GetRow()するたびに使用メモリが
増加していき、メモリ不足になってしまいます。

A12 20
[解決方法]
for文内にGetRowの記述があると、都度FlexRowオブジェクトと全列に対応するFlexCell
アクセッサオブジェクトが生成されますので、1回の処理につき、行数×(列数+1) の
オブジェクトが生成されます。

for( var i = 0; i < FlexView1.RowCount; i++ ){
    var r = FlexView1.GetRow( i );
    if( r.FlexText1.Value == tmpdata ){
        r.FlexLabel1.FgColor = $RED;
            :
            :
    }
}

上記の記述の場合、ループの都度、r変数内のFlexRowオブジェクトを破棄して新しい
FlexRowオブジェクトを生成することになります。
オブジェクト数が増えると、メモリのゴミ掃除に処理時間が費やされるため、全体の処理
速度は低下してしまいます。
また、メモリの断片化も進みやすいため、ゴミ掃除後の処理速度も低下します。

[参照]
Biz/Browser・Biz/Designer TIPS集 > リソース > Biz/Browserのリソース管理


この速度低下を避けることは出来ませんので、速度低下を起こさないように無駄に
オブジェクトの生成と破棄を繰り返さないように、適切なコーディングが必要になります。

以下は、FlexViewで重複行のチェックを行う処理での不適切なループ記述の例です。
var row2 = FlexView1.GetRow( 0 );                     <--(1)
String s;
while( !row2.end ) {
    s = row2.FlexText1.value;
    for( var i = 0; i < FlexView1.RowCount; i++ ) {
        var row = FlexView1.GetRow( i );              <--(2)
        if ( s == row.FlexText1.value ){              <--(3)
            /*エラー処理*/
        }
    }
    row2.moveNext();
}


(1) で1行目(先頭行)を取得しています。
(2) で i は0ですから再び(1)と同じ行を取得します。
(3) は(1)と(2)つまり同じ行の同じ列を比較しているので最初はエラーとなります。

その後、forループで2行目以降を取得しますが、ループの都度row変数内のFlexRow
オブジェクトを破棄して、新しいFlexRowオブジェクトを生成し次の行を取り出す、という
動作となるので、このループで 「行数×(列数+1)分」 のオブジェクト生成と破棄が
行われます。
更に、whileループで全行回りますので生成されるオブジェクト数は、
「行数 × ((列数+1) + (行数×(列数+1))」 で、例えば100行、10列の場合では
  100 x ((10+1) + (100x(10+1)) = 111,100
と10万個を超えますので、メモリ不足が起こる危険性があります。


【問題その1】
このループ構造では、外側のループと内側のループとも全行回るので、同じ組み
合わせのセル(1行目と2行目など)に対して2回ずつ比較されます。
データの重複チェックの目的では2回ずつ比較する必要はありませんので、この
ループ処理は無駄な処理と言えます。

【問題その2】
内側のループでGetRowを繰り返しますが、このFlexRow取得は、外側のループのように
MoveNextメソッドを使えば、オブジェクトの生成と破棄は抑えられます。


正しいコードは次のようになります。
var row2 = FlexView1.GetRow( 0 );
var s;
while( row2.position < FlexView1.RowCount - 1 ) {
    s = row2.FlexText1.value;
    var row = FlexView1.GetRow( row2.position + 1 );
    while( !row.end ) {
        if ( s == row.FlexText1.value ) {
            /*エラー処理*/
        }
        row.MoveNext();
    }
    row2.MoveNext();
}



CRSファイル形式のサンプルを
  「FlexViewメモリ消費削減のサンプル(Flx_020.zip)
よりご利用いただけます。

管理番号:Flx_020
 
  Biz-Collections Bizの宝箱 トップへ
  Biz/Browser・Biz/Designer TIPS集 トップへ