その他: バッチの高速化-2

今回は、Magicのプログラミングによる高速化について。

昔のバージョンからありますが、タスク常駐です。
設定はタスク特性にあり、これを「Yes」にします。
タスク常駐

設定するのはバッチタスクですが、連続してコールされるタスクで効果を発揮します。
例えば、次の図のようなタスク構造で考えてみましょう。
タスクツリー

親タスクはオンラインです。
子タスクと孫タスクがバッチです。
この構造でタスク常駐を設定する意味があるのは、孫タスクだけです。
子タスクに設定しても、おそらく効果はないでしょう。

タスク常駐は、連続して繰り返し同一タスクをコールされる場合に設定するものです。
従って、バッチの最上位に設定しても意味はないと考えられます。
また、下位のタスクでも必ず効果があるとは言えません。

例の構造で、孫タスクのコールが、子タスクのタスク前やタスク後ならば効果はないでしょう。
連続コールにならないので。
効果があるのは、相当数ループする子タスクのレコード処理からコールされる場合です。

従って、データ状態によっても効果が大きく変化します。
子タスクが10件しかループしない条件と、10000件ループする条件では異なると思われます。
そのため、理論的な理解をした上で、実データに近い環境で実験することが必要です。

最後に、念のための注意事項を記載しておきます。

冒頭に書いたように、この機能は昔からあります。
しかし、活用事例は多分少ないと思います。
なぜならば、昔のバージョンでは安定感に疑問があったからです。

タスク常駐したものは、コール元タスクが終了する際、一緒にメモリから解放されます。
上記の例では、子タスク終了時に、子タスクと孫タスクが一緒に解放されるイメージです。
(常駐していなければ、孫タスク終了時に単体で孫タスクのみメモリから解放されます。)

しかし、何らかの原因で解放されず残ってしまうなど、不安定になることがありました。
(OSの問題なのか、Magicの問題なのかは、よく分かりません。)
そのため、この機能が敬遠されてきた歴史があります。

個人的には、この機能は、今でも切り札的に使うようにしています。
使いどころを厳選している、という感じでしょうか。

具体的には、タスク常駐を使った一連のバッチ処理が終わった後、Magicを終了できる場合です。
日次バッチや、夜間の自動起動バッチ等が代表例です。
Magic本体を終了すれば、メモリも確実に解放されるでしょう。
更に、その後、OSも再起動(またはシャットダウン)される状況になればベストです。