お世話になっております。 ロジカル・アーツの中村で御座います。
最近になってバッチ処理を作成する機会があり、検証を行った際に ヒープ制限に引っかかってしまうことがありました。 対応方法を模索したところ、良い解決方法を発見できましたので 記録とご共有を兼ねてご紹介したいと存じます。
ヒープサイズ制限とは
「Apex heap size too large (Apex ヒープサイズが大きすぎます)」のエラーを指します。 処理中にメモリに格納されているデータが多すぎる場合に発生します。 この制限自体は 「同期コール」と「非同期コール」 によっても異なります。 Apexの基本的な概要については開発者ガイドに記載されておりますので、是非ご確認下さい。
処理の例
エラーが起きやすい例
以下のソースコードの様に、膨大なデータをListに格納した場合、 ヒープサイズ制限によりエラーとなることがあります。
List<sObject> sobjList = [SELECT Id, Name ,・・・FROM sObject]; for(sObject obj : sobjList){ //任意の処理 }
ヒープサイズ制限を回避するために改修した例
個人的な解釈も含まれますが上記のエラーが発生しやすい状況を回避するために、 Listに格納していた分のメモリ領域を使用せず、 SOQLから直接データを使用する方法になります。
for(sObject obj : [SELECT Id, Name ,・・・FROM sObject]){ //任意の処理 }
注意点
・DML操作の制限 ・選択するフィールド ・共有ルールの影響 など、他にもいくつか注意点はございますので、 作成・改修されているソースコードに合わせて、ご確認してみてください。
最後に
今回ご紹介したい内容は以上となります。 いかがでしたでしょうか。
私もまだまだ、ヒープサイズの制限やガバナ制限については把握しきれていないことが多くありますが、 上手いこと制限に付き合っていければと思います。
今回ご紹介した内容が、読者様の助けとなれば幸いです。 他にも開発者ガイドには多くの機能や制限について記載されておりますので、 是非ご確認してみてください。