その他: バッチの高速化-2
今回は、Magicのプログラミングによる高速化について。
昔のバージョンからありますが、タスク常駐です。
設定はタスク特性にあり、これを「Yes」にします。
設定するのはバッチタスクですが、連続してコールされるタスクで効果を発揮します。
例えば、次の図のようなタスク構造で考えてみましょう。
親タスクはオンラインです。
子タスクと孫タスクがバッチです。
この構造でタスク常駐を設定する意味があるのは、孫タスクだけです。
子タスクに設定しても、おそらく効果はないでしょう。
タスク常駐は、連続して繰り返し同一タスクをコールされる場合に設定するものです。
従って、バッチの最上位に設定しても意味はないと考えられます。
また、下位のタスクでも必ず効果があるとは言えません。
例の構造で、孫タスクのコールが、子タスクのタスク前やタスク後ならば効果はないでしょう。
連続コールにならないので。
効果があるのは、相当数ループする子タスクのレコード処理からコールされる場合です。
従って、データ状態によっても効果が大きく変化します。
子タスクが10件しかループしない条件と、10000件ループする条件では異なると思われます。
そのため、理論的な理解をした上で、実データに近い環境で実験することが必要です。
最後に、念のための注意事項を記載しておきます。
冒頭に書いたように、この機能は昔からあります。
しかし、活用事例は多分少ないと思います。
なぜならば、昔のバージョンでは安定感に疑問があったからです。
タスク常駐したものは、コール元タスクが終了する際、一緒にメモリから解放されます。
上記の例では、子タスク終了時に、子タスクと孫タスクが一緒に解放されるイメージです。
(常駐していなければ、孫タスク終了時に単体で孫タスクのみメモリから解放されます。)
しかし、何らかの原因で解放されず残ってしまうなど、不安定になることがありました。
(OSの問題なのか、Magicの問題なのかは、よく分かりません。)
そのため、この機能が敬遠されてきた歴史があります。
個人的には、この機能は、今でも切り札的に使うようにしています。
使いどころを厳選している、という感じでしょうか。
具体的には、タスク常駐を使った一連のバッチ処理が終わった後、Magicを終了できる場合です。
日次バッチや、夜間の自動起動バッチ等が代表例です。
Magic本体を終了すれば、メモリも確実に解放されるでしょう。
更に、その後、OSも再起動(またはシャットダウン)される状況になればベストです。