OutOfMemoryErrorの回避方法
作成した連携処理を実行したときに何らかの問題が発生し、サポートに問い合わせたところ「OutOfMemoryErrorである」という回答される場合があります。この場合の対応について説明します。
OutOfMemoryErrorが発生する例
まず最初にOutOfMemoryErrorが発生するケースについて紹介します。たとえば次のようなケースが考えられます。
300MB、100万レコードのCSVファイルを使用してSFDCのデータ書き込み(INSERT)処理でSFDCに書き込みを実施したところ、3時間程度経過し、10万件程度登録したあたりで処理が停止しました。Studioへのログイン自体が不可となったため、サポートに確認したところOutOfMemoryErrorのためプロセスが停止していたとのことでした。
対応方法
Salesforceアダプタに関する情報
「挿入結果取得有無」の必要性を検討する
データ書き込み(INSERT)の「挿入結果取得有無」が有効になっているかご確認ください。
有効の場合、書き込んだ結果のレコードを後続処理のためにメモリに保持します。たとえば上記の例では10万件程をメモリに保持した時点でOutOfMemoryErrorが発生したと考えられます。
回避策としまして以下の2案が考えられます。
① データ書き込み(INSERT)の結果を後続の処理で使用していない場合は「挿入結果取得有無」を無効にして頂くことでデータの保持をしないためOutOfMemoryError は発生しません。
② データ書き込み(INSERT)の結果を後続の処理で使用している場合は、後述する「大容量データ処理」を検討してください。
Salesforceから大きいサイズのファイルを取得している
Salesforceのコンテンツには大容量のファイルを格納できますが、そのファイルをSOAP APIを使って取得する場合、40-50MB程度を超えるとOutOfMemoryErrorが発生する場合があります。
SalesforceではSOAP APIのほかにREST APIが提供されており、今回のケースではREST APIを使うことが適切です。
REST APIを使ったファイルの取得方法については、Salesforceコンテンツのファイルを取得する を参照してください。
JDBCアダプタ(およびその他のデータベース系アダプタ)に関する情報
テンポラリデータベースから読み出す1レコードのサイズが大きい
テンポラリデータベースから読み出す1レコードのサイズが大きい場合、JDBCドライバ内部でOutOfMemoryErrorが発生している可能性があります。
この場合は1回にフェッチするレコード数を調整することで回避出来る可能性がありますので、ご利用のコンポーネントの読み取り設定プロパティのフェッチサイズの値の変更をご検討ください。
フェッチサイズの変更ができないコンポーネントの場合にはサポートにご相談ください。
テーブルからのフェッチサイズの変更
連携に使用しているデータベース(RDB)テーブルの1レコードのサイズが大きい場合、OutOfMemoryErrorが発生する場合があります。これはJDBCドライバがテーブルからまとめてデータを取得する際、その総容量が大きい場合に発生します。これが原因と思われる場合は、サポートにご相談ください。
ファイル系アダプタに関する情報
ファイルの出力先の変更
以下のフォルダに大容量のファイルを出力すると本エラーが発生する場合があります。
- /etc
- /home
- /share
ファイルの出力先としては「/data」配下へ変更することで回避可能となります。
連携に利用するフォルダについては、連携に利用するファイルの配置場所についてをご確認ください。
Excelアダプタに関する情報
スケールアップオプションの検討
次のようなケースでOutOfMemoryErrorが発生する場合は、ヒープサイズを増やすために、後述する「スケールアップオプション」をご検討ください。
- 「シートから読み取り」「定義済み範囲から読み取り」「シート名一覧取得」をファイルサイズが大きいExcel 2003/XP/2000形式のブック(.xls)に対して行っている。
- 大容量データ処理に対応していない Excel 2010/2007形式のブック(xlsx、xlsm)に対して操作している。
大容量データ処理を検討する
SkyOnDemandではメモリの枯渇を押さえるために「大容量データ処理」という機構が用意されています。
この機能を設定すると、オンメモリで保存していた処理中のデータを、一時ファイルに書き出すことによりメモリ利用量を抑制することが可能になります。
(オンメモリの実行に対して理論上では実行速度は劣りますが、実測上ではミリ秒単位での誤差程度です。)
大容量データ処理を利用するには、次の2つの方法があります。
① スクリプト単位で設定する
[デザイナ]-[プロジェクトエクスプローラ]にてスクリプトの右クリックメニューから「プロパティ」を選択します。そこで「データ処理方式」タブの「大容量データ処理を行う」にチェックを入れます。
② アイコン単位で設定する
[デザイナ]にて該当のスクリプトを描画し、該当のアイコン(エラーとなっている[データ書き込み(INSERT)])のプロパティを開きます。そこで「データ処理方式」タブの「データ処理方式」にて「大容量データ処理を行う」を選択します。
(この設定することができるアイコンは、後続にデータフローを引くことができるアイコンです。アイコンごとの設定可否は各ヘルプページの項「大容量データ処理」をご確認ください)
スケールアップオプションを利用する
解決しない場合は、メモリサイズを増やすスケープアップオプションをご検討ください。詳細は弊社営業担当におたずねください。
テラスカイ管理番号 C-00008550, CA-30079