こんにちは。インフォテリアのキクチです。
少しずつ春っぽさが出てきましたね。
この前上野駅前を通りかかったら桜が咲き始めていました。開花宣言はまだみたいですが、ピンクが舞ってくると一気に春の雰囲気になりますね。
さて、今回は大きなサイズのファイルを連携してみたいと思います。
実運用でメモリ不足のエラーを出さないためにどう連携するのか、ヒントになればと思いながら体験してみましたので、どうぞ参考にしてください!
目次
さぁ、今回も気合を入れて体験していきたいと思いますが、その前に!
前回のブログを公開した後、スーパーASTERIAer(ASTERIA Warpにすごく詳しい人の意)のNさんからご指摘をいただきました。
Nさん「キクチくん、ブログがんばってるね~」
キクチ「ありがとうございます!分からないなりに精一杯やらせてもらってます。」
Nさん「でもさ~、今回の複数ファイル連携、もっとイケてるフローに出来るよ。」
キクチ「イケてないですか!?だいぶスマートになったんですけど…」
Nさん「イケてないというか、もっと簡素に出来るかなと…。連携要件を考えて作ったみたいだけど、要は単純なファイルコピーだよね?」
キクチ「はい。日次かなんかであるフォルダに置かれたファイルを別ファイルにコピーしてくる想定で作ってみました。」
Nさん「それであれば、 CopyFileコンポーネント使っちゃえば一発だよ。」
キクチ「… CopyFile!?そんな便利なコンポーネントがあるんですか??」
Nさん「ファイルタブのところ見てみると、ファイル操作に必要なものは一通り揃ってると思うから見てみるといいかもね。」
キクチ「…なんと…」
と、いうことで見てみましたファイルタブのコンポーネント。
なんとファイルのコピーや移動(リネーム)、削除に存在確認なんかもこのタブのコンポーネントで行えちゃいますね。
詳しくはリファレンスを見ていただければと思いますが…
なんと…コンポーネント一個で実現してしまいました…
データの中身を変換などかける必要がなければ、こちらの方が断然すっきりしますね。
またひとつASTERIA Warpの簡単さを知ってしまいました…!
さて、ここからが今回の本題です。サイズの大きなファイルの連携、体験してみます!
日々のデータを蓄積していく過程で、どうしてもファイルサイズは大きくなってしまうと思います。
今回はそんなファイルを連携するにはどうしたら運用を止めずに行えるかを試してみます。
以下の想定でフローを考えてみます。
たったこれだけ。フロー自体はシンプルなものになりそうです。
新しいフロー「ファイル連携3」を立ち上げて設定しました。
読み込み元ファイルはこちらの約100MBのファイルを使用します。
メッセージ的には「ASTERIA Warpに割り当てられたヒープメモリが不足している」ということが読み取れます。
運用を考えれば、FSMC(管理コンソール)からASTERIA Warpでの最大メモリサイズの設定を変更することも手段の一つかもしれませんが、まずはフローの作り方で対応できないか考えてみます。
…考えるといっても、いつも通りスペシャリストに聞いちゃったんですが…(汗)
キクチ「Hさん、大きなサイズのファイルを連携したいんですけど、メモリが足りなくて失敗しちゃうんですよね~。メモリを食わないフローの作り方ってありますか?」
Hさん「ん~…。深いところまで知りたい?浅くてもとりあえず実行できるようにしたい?」
キクチ「今回はぜひ!浅いところでもとりあえずでお願いします!」
Hさん「それならRecordGetコンポーネントを使ってみたらどうだろう?」
キクチ「RecordGet…!それはどんなコンポーネントなんですか?」
Hさん「FileGetコンポーネントはファイルを丸ごとストリームとして取り込んできてたけど、RecordGetコンポーネントは1レコードずつ読み込んでくれるんだよね。」
キクチ「なるほど。ファイル全体分をメモリに読み込んでこないから大量データでもメモリを浪費しないって感じですかね。」
Hさん「そんな感じかな~。まぁとりあえずやってみなよ!」
キクチ「ありがとうございます。やってみます!」
そんな便利なコンポーネントがあるんですね~と、いうわけで、RecordGetコンポーネントを使ってフローを作り直してみます。
FileGetをRecordGetに置き換えただけですね。
ちなみに、FileGet⇒RecordGetの置き換えは、FileGetコンポーネントを右クリックで表示されるメニューの中から「コンポーネントの置き換え」メニューでも行えます。
いちいち、コンポーネント削除⇒新しいコンポーネントの配置⇒線の引き直し、というステップを踏まなくてもいいので、こちらの方が簡単かもしれませんね。
RecordGetコンポーネントはプロパティも
FileGetコンポーネントとそんなに違わないみたいです。
簡単に作り直せたので早速実行してみます。
でも…メモリ不足は解消されましたが、今度はタイムアウトで失敗してしまいました…
キクチ「Hさん…今度はタイムアウト起きちゃったんですが…」
Hさん「あ、やっぱり?メモリ不足になるくらいだから、RecordGetをそのまま使っても正常には終わらないかとは思ってたんだよね~」
キクチ「やっぱり…なんですね(汗)これってRecordGetコンポーネントだと1レコードずつ取得してくるから、時間はかかってしまうってことですかね?」
Hさん「まぁそういうことだね。タイムアウトの設定はフローのプロパティで設定できるから変更してもう一回やってみな。それにRecordGetのプロパティで一度に取得する行数を指定できるから、そこも変更してみると早くなると思うよ」
キクチ「え…1行ずつとってくるだけじゃないんですね!」
というところのようですね。
使い分けとしては環境でのメモリの上限とか、作成したフローの終了期限などの運用要件とのバランスをとる必要がありそうです。
何はともあれ、フローのタイムアウト・取得行数の設定を変更して再挑戦です。
ちなみに、先ほど表示されたメッセージからは「フローはまだ動いている」とのことでしたが、今回のようにデザイナー上でタイムアウトになってもサーバー上では処理は継続されているようです。
※各タイムアウト値の関連性については今回は省略します。
フローのプロパティはツリーペインでプロパティを見たいフローを選択すれば、右上のインスペクタがフローのプロパティが切り替わります。
フローのプロパティではタイムアウトの設定の他にもエラーが発生した際に起動するサブフローやセッションをフロー終了時に閉じるかどうかの設定も出来るみたいです。
180秒でエラーになったので、思い切って5倍の900秒を設定してみます。また、取得行数のプロパティも1000に設定します。
実際は15分もかからず、取得行数のおかげで20秒程度でフローが終了していたことがログから確認できました。
ふぅ、大きなサイズのファイルでもしっかりと連携できました。
FileGetコンポーネントとRecordGet コンポーネントはフローの性能要件によって使いどころは変わってくるかもしれませんが、メモリが豊富ではない環境でもフローを実行できる機能がコンポーネントとして用意されているのはありがたいですね。
今回はここまでにしたいと思います。
さて、ASTERIA Warpを用いてデータ連携する際にはデータの加工、変換が必要な場面がたくさんあると思います。
ここまでは単純なマッピングを行ってきましたが、MapperはASTERIA Warpにおけるデータ変換を担っています。
次回はそんなMapperでのデータ変換、関数の使い方などを体験してみたいと思います。
それではまた!
ASTERIA Warpのプリセールスエンジニア&体験セミナー講師。関係各所から舞い込んでくるASTERIA Warpに関するご依頼になんとか応えながら日々鍛えてもらっています!
Related Posts
ASTERIA Warp製品の技術情報やTips、また情報交換の場として「ADNフォーラム」をご用意しています。
アステリア製品デベロッパー同士をつなげ、技術情報の共有やちょっとしたの疑問解決の場とすることを目的としたコミュニティです。