[mayaa-user:1055] Re: 巨大なループをサポートする方法

Susumu ISHIGAMI [E-MAIL ADDRESS DELETED]
2016年 1月 18日 (月) 16:33:52 JST


いしがみです。

> また、途中状態でflushするとしても、子コンポーネントのレンダリング結果を受けて処理する
> コンポーネントの場合にはそこで貯めてしまうので同じことになります。

なるほど。仕組み上難しいことを理解致しました。
確かにストリーミングをしたいのなら、その辺り頑張るより、
部分的にJSPやServletを使ったほうが楽かもしれませんね。

ただ、テンプレート編集時に巨大なループを入れ子にしてしまってうっかりOutOfMemoryになるということは
無限ループ同様「ひどいこと」だと思います(T-T)

256制限と同等のレベルにするなら、累積のループ回数を一定量で制限するあたりでしょうか。(そういうパッチはすぐにでも渡せます)
もっといいのは、積み上がったバッファの使用量を計算して、一定のしきい値以上で打ち切る(エラーにする | 画面が切れる)ことだと思います。
この辺り、何かいい方法が見つかったら共有します。

2016年1月16日 0:16 suga <ko.suga @ gmail.com>:
> suga です。
>
>> もし上手いこと、ForProcessor処理中でも、
>> CycleWriterImpl
>> をflushできれば、
>> クライアントに結果をストリーミングできるのではないかなと思います。
>
> 途中状態をどんどんflushしていくと途中でエラーが起きたときに
> 途中まで書かれてそこで止まり、エラーページを表示することができません。(Velocity なんかはそうですね)
> サーバサイドでレンダリングを全部通してから、というのがそのあたりの思想です。
> また、途中状態でflushするとしても、子コンポーネントのレンダリング結果を受けて処理する
> コンポーネントの場合にはそこで貯めてしまうので同じことになります。
>
> もしそのように変更するとすれば、途中状態をファイルに書き出して、処理が終わったら読み出して、
> とすることですが常時そんなことをしては当然処理速度が落ちますので、
> 何かしらの処理分岐をしたりすることになるでしょう。
>
>
> なおループの制限を設けているのは、単純にうっかり無限ループになる条件が
> 起きうる状態でネットに公開してしまうとひどいことになるのでその防止策、だったと思います。
> あらかじめ用意したListなどを回すならforEachを使ってね、ということで。
> 初期値が妥当かはまた別の話ですが。
>
>
> --
> suga ( ko.suga @ gmail.com )
>
>
> 2016-01-15 14:52 GMT+09:00 Susumu ISHIGAMI <susumu.ishigami @ gmail.com>:
>> いしがみです。
>>
>> UserMLで扱う内容なのかどうか悩みつつ、微妙なことを質問させていただきます。
>>
>> 意地悪な例でMayaaファイルに
>>
>> <m:for id="LARGE_LOOP" init="${var i = 0;}" test="${i &lt; 256}"
>> after="${i++}" />
>>
>> のように書いて、テンプレートで次のように、無理やり入れ子すると、
>>
>> <div id="LARGE_LOOP">
>> <div id="LARGE_LOOP">
>> <div id="LARGE_LOOP">
>> <div id="LARGE_LOOP">
>> <div id="LARGE_LOOP">
>> aaa
>> </div>
>> </div>
>> </div>
>> </div>
>> </div>
>>
>> OutOfMemoryErrorが発生します(起動時の割当てヒープ量に依存)
>>
>> 原因は
>> AbstractResponse._stack
>> に格納された
>> CycleWriterImpl
>> の_buffer
>> が無限に増殖してしまうためです。
>>
>> もし上手いこと、ForProcessor処理中でも、
>> CycleWriterImpl
>> をflushできれば、
>> クライアントに結果をストリーミングできるのではないかなと思います。
>>
>> 実現するための、良いアイデアはありませんでしょうか?
>> (例えば、CycleWriterImplが一定のバッファサイズを超えたら自動でwriteOutするようにしたらまずいか?)
>>
>> これが出来れば、ループの上限も256で制限する必要もなくなり、
>> MayaaでCometのような仕組みも作れるのではないかと思います。
>>
>> 基本的なことなので初期の頃議論済みであれば申し訳ありません。
>>
>> 以上、よろしくお願い致します。
>>
>> --
>> Susumu ISHIGAMI
>> susumu.ishigami @ gmail.com
>> _______________________________________________
>> mayaa-user mailing list
>> mayaa-user @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/mayaa-user
> _______________________________________________
> mayaa-user mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user



-- 
Susumu ISHIGAMI
susumu.ishigami @ gmail.com


mayaa-user メーリングリストの案内