05-16-2014, 07:21 PM,
|
|||||
|
|||||
RecordGridColumnの配列は、フィールドで定義するな
★point
RecordGrid.columns に設定するRecordGridColumnの配列は、フィールドで定義するな! 下記の数値は、RecordGridUI.get-cell-at で、 1回につき、100レコード×100カラム のセルを取得した場合の、 メモリの使用量の推移です。 ※Curlのメモリ使用量は、「タスクマネージャ」の「プロセス」タブで表示される 「surge,.exe」の「メモリ(プライベートワーキングセット)」を参照しました ■セル取得時のメモリ使用量 ①「field定義のカラムを利用」した場合のメモリ消費量(単位は100KB) 1回目: 508 差分 2回目: 791 283 3回目:1074 283 4回目:1347 273 5回目:1629 282 6回目:1894 265 7回目:2195 301 ②「一時的なカラムを利用」した場合のメモリ消費量(単位は100KB) 1回目: 549 差分 2回目: 791 242 3回目:1075 284 4回目:1347 272 5回目:1367 20 6回目:1383 16 7回目:1407 24 ①と②の違いは、下記のアプレットのコードを見てもらうとわかりますが、 簡単に言うと、RecordGrid.columns に設定する{Array-of RecordGridColumn} を、 クラスのフィールド(field)に定義して利用するか、そうでないか、というものです。 Code: {define-class public Screen {inherits Dialog} 数値の推移をみてもわかるように、フィールドで定義して利用した①には、 単純増加傾向がみられるのに比べ、 そうではない②は、4回目以降、メモリの使用増加量が低下しています。 ①については、私が試した限りでは20回以上、単純増加傾向か続きました。 また、各処理の間で、明示的に「ガベージコレクト(garbage-collect)」を呼び出した場合も、 ①ではその効果がみられませんでした。 プログラムでは、グリッドを毎回作り直しているので、 以前のグリッド内で生成されたセルは、ガベージとして認識され、破棄されてほしいところですが、 私の試した限りでは、そのように期待した結果にはなりませんでした。 どうも、フィールドで定義したカラムを利用して生成されたセルは、 そのフィールドの親クラスが破棄されるまで、 ずっとガベージとして認識されないのではないかと推測されるのです。 静的に、グリッドとカラムを保持するような画面であればよいのですが、 グリッドに対して何度もカラムの再設定をする処理のある画面では、 上記のように、メモリの使用量がどんどん増えてしまう、 という問題が起こる可能性があります。 今回私が試した環境は、Windows7+Curl8.0.4 だけですので、 この現象が、ほかの環境でも発生するかは不明ですが、 できるだけ、RecordGridColumn の配列は、フィールドで定義せず、 記載したアプレットのサンプルソースのようにgetterで一時的に作成するなどの方式にしたほうがよさそうです。 |
|||||
05-27-2014, 10:57 AM,
|
|||||
|
|||||
RE: RecordGridColumnの配列は、フィールドで定義するな
フィールド定義より、ゲッターで返したほうが増加傾向は抑えられているのですが、
1万件くらいの大量レコードを読み込んでから、RecordGridUI.get-cell-at で全セルを取得すると、 やはりかなりのメモリを消費し、かつ、ガベージコレクトでもメモリが解放されません。 こまった・・・。 |
|||||
05-29-2014, 05:50 PM,
(This post was last modified: 06-30-2014, 09:56 AM by umemura.)
|
|||||
|
|||||
RE: RecordGridColumnの配列は、フィールドで定義するな
私の考え違いでした。メモリ解放されました。
下記のサンプルで試していたのですが、 ポイントは、グリッドに渡したカラムの配列をクリアする、ということのようです。 前のサンプルで、カラムの配列を明示的にクリアしていなくても、 getterの場合にはメモリが解放されていたのは、 RecordGrid.columns に新しいカラムの配列が設定された時点で、 古いカラムの配列がガベージとして判断されたから、ということかもしれません。 field で定義してしまうと、うかつにクリアできないですし、 やはり、RecordGridColumn の配列は、 getter を利用して一時変数で作成する、というのが、 セルのインスタンスをガベージとして認識させるには正しいようです。 Code: {def columns-tf = {TextField value = "30"}} |
|||||
« Next Oldest | Next Newest »
|
Users browsing this thread:
2 Guest(s)
2 Guest(s)