DataTable 操作のパフォーマンスが上がった話

こんにちは、AI&ロボティクスセンターの大川です。

今回はRPA業務で、ちょっとした工夫でロボット動作のパフォーマンスが大きく上がったということをお話しします。

RPAで多用される定型業務の一つに、Excelデータの処理があります。
複数のExcelファイルにある大量のデータから特定の列を抽出して一つのExcelファイルに出力したり、その出力処理の前処理として複数条件でデータを集計してから出力したりと、人が手で作業するには非常に時間がかかりミスも発生しやすい定型業務を、ロボットで正確に処理してくれます。
現在は、UiPathというアプリケーションを使用したRPAの開発を行っており、Excelファイルの処理はDataTableという型のデータを扱うことになります。

※UiPathでコードを記述するときは、VB.NETという言語を使用します。

どんな問題が発生したのか

DataTableから条件に合う行を抽出するときに、ものすごく時間がかかるという問題が発生しました。

DataTable.Select(“条件”) というメソッドがあるのですが、最初はSelect自体が時間のかかるものではないかと思われていました。
それを一つのワークフローで複数回使用しており、数万レコードに対して行っていたため、Select自体を使うべきではないのでは?と思われていました。

調査と原因の発見

まず、遅い原因となっているワークフローのFor Eachアクティビティをコメントアウトして実行したところ、かなりの速度が出ました。

ForEach

これがFor Eachアクティビティです。Bodyの中身を回していきます。

やはり、繰り返し部分で速度が非常に遅くなっていたようです。
次に、原因と思われていたSelectを使っているアクティビティを全てコメントアウトして実行すると、またかなりの速度が出ました。
では、Selectが原因なのか?と今度はSelectを使っているアクティビティを一つずつコメントアウトしました。すると、ある一つのアクティビティをコメントアウトしたら速度が上がりました。
それは、Selectのフィルタ条件を一度に3つ設定していたのでした。

DataTable.Select(“条件1 AND 条件2 AND 条件3“)

こんな感じです。

ではどうしたのか?

この遅くなった原因であるコードと、コメントアウトしても速度に変化の無かったコードを見比べると、他は全てフィルタ条件が1つなのに対し、原因のコードだけが複数条件を指定していたことで、フィルタ条件を一回ずつ適用したら速くならないか?と思いました。

DataTable = DataTable.Select(“条件1“).CopyToDataTable
DataTable = DataTable.Select(“条件2“).CopyToDataTable
DataTable = DataTable.Select(“条件3“).CopyToDataTable

※ DataTable.SelectではDataRow[ ]型になるので、CopyToDataTableメソッドでDataTable型に変換できます。

これで実行すると、速度がかなり上がりました!
前は2時間40分かかっていた処理が、5分程度で処理が完了するようになりました。

まとめ

DataTable.Select(“条件”) の条件は、一度に複数指定しないほうが良い!

参考リンク

DataTable.Select メソッド
https://msdn.microsoft.com/ja-jp/library/way3dy9w(v=vs.110).aspx

  • このエントリーをはてなブックマークに追加

クレスコのRPAセミナー

クレスコではAIやRPAをテーマとした技術セミナーを定期的に開催しています。現役エンジニアが実践的なノウハウを提供します。ぜひご活用ください。

◆受講者の声
[無料セミナー]RPA導入ファーストステップ
「UiPathのデモ、各ツールの比較が分かりやすく有益と感じた。」
「RPA導入で種々の問題点があるので、”つまずき”の部分が参考になった。」

[オーダー研修]RPA/UiPathハンズオン
「今まで迷ったところや分からなかったところがすべて判明した爽快感がありました。もっと早く受けたかったです。」
「RPA導入新任者向け研修として最適。今後、当社のRPA開発者向け研修として活用させていただく事を検討します。」


クレスコのRPAセミナーを詳しく見る