こんにちは、AI&ロボティクスセンターの大川です。
今回はRPA業務で、ちょっとした工夫でロボット動作のパフォーマンスが大きく上がったということをお話しします。
RPAで多用される定型業務の一つに、Excelデータの処理があります。
複数のExcelファイルにある大量のデータから特定の列を抽出して一つのExcelファイルに出力したり、その出力処理の前処理として複数条件でデータを集計してから出力したりと、人が手で作業するには非常に時間がかかりミスも発生しやすい定型業務を、ロボットで正確に処理してくれます。
現在は、UiPathというアプリケーションを使用したRPAの開発を行っており、Excelファイルの処理はDataTableという型のデータを扱うことになります。
※UiPathでコードを記述するときは、VB.NETという言語を使用します。
DataTableから条件に合う行を抽出するときに、ものすごく時間がかかるという問題が発生しました。
DataTable.Select(“条件”) というメソッドがあるのですが、最初はSelect自体が時間のかかるものではないかと思われていました。
それを一つのワークフローで複数回使用しており、数万レコードに対して行っていたため、Select自体を使うべきではないのでは?と思われていました。
まず、遅い原因となっているワークフローのFor Eachアクティビティをコメントアウトして実行したところ、かなりの速度が出ました。
やはり、繰り返し部分で速度が非常に遅くなっていたようです。
次に、原因と思われていた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