データテーブルの任意の列を全角→半角にしたい

UiPath初心者です。
データテーブルの任意の列に置いて、全角→半角 の変換がしたいです。
現在、以下の通り作ってみたのですが、
処理がかなり遅く、最後に「予期しない終了コードでジョブが停止されました」とエラーも出ます。
改善部分を教えて頂きたく、よろしくお願いいたします。

image

画像で共有いただいたところについては、特に違和感はないですね。
いくつか追加で情報をいただけませんでしょうか。

  • 「処理がかなり遅く」と書かれていますが、具体的にどのアクティビティの処理に時間がかかっていますか?
    • デバッグモードで実行いただき、アクティビティごとの開始/終了の時間を確認してみてください。
  • 「エラーも出ます」と書かれていますが、どのアクティビティでエラーが発生しますか?
  • この事象は、処理対象のデータを変えても起こりますか?
    • データの行数を増やしたり減らしたり、あるいはデータ自体を書き換えても同じ事象が起きますか?
1 Like

ありがとうございます。
検証しました。
最初の状態では、以下の通りの処理時間・エラー箇所となっておりました。
対象データの行数を 275000→24 にしたところ、 3秒で全ての工程が問題なく終わりました。
元データの件数が多すぎると言うことでしょうか。

こんにちは

275,000件ですと、空のForEachRowでもかなり時間がかかるのではないかと思います。
アクティビティのループはかなり遅いので、パフォーマンスを要する場合は
LINQを使うか、Invoke Code内でループを記述すると良いかと思います。
また最後のエラーは、ExcelApplicationScopeを使うと回避できるかもしれません。

以下一例です。

Sample20210601-1.zip (2.9 KB)

1 Like

同じように「予期せぬエラー」になったことがあります(数十万のループでExcel操作書き込み)

マシンスペックでの差はありますが、繰り返しアクティビティはその性質上「1件処理するだけで0.2秒から1秒くらいロスする」ので、大量データになるとそれだけ処理時間が増えます。(アクティビティを読み込むコスト、アクティビティ感をつなぐコストが掛かっている)

仮に1秒余計にかかるとして、無駄に掛かる時間
・10件=10秒 ※ 気が付かないレベル
・100件=100秒 ※ なんか遅いくらい
・1000件=1000秒(16分) ※ 遅いと分かる
・10000件=10000秒(166分)ロス ※ 凄く遅い

なので、「ループの処理&ループ内の処理」をInvokeCodeで書いたら早くなりました。

個人的な経験、感覚ですが、1万以上は繰り返しアクティビティでは、あまりループさせたくないです(時間掛かっても良い処理なら問題ないですけど)

1 Like

ありがとうございます。
確認が遅くなり大変失礼いたしました。
invoke について、まだ理解していない為よく分からないのですが、
頂いたinvokeの部分の構造をそのまま『繰り返しデータテーブル』と交換しました。
dt を元の変数名に戻し、実行すると、
image
このようなエラーとなりました。
どのように対処したら良いか教えて頂きたくよろしくお願いいたします。

image

お世話になっております。
確認が遅くなり大変失礼いたしました。

大変勉強になりました。
1000件を超えたら繰り返しを使ったらダメなのですね。
この内容は早速社内に展開していきます。
InvokeCodeが全く分からないので Yoichi様から頂いたサンプルと格闘します!

本当にありがとうございます。

こんにちは

Invoke Codeの引数部分(ボタンをクリックして出てくる画面)はどのようになっていますでしょうか?

またエラーの詳細内容を共有できますでしょうか?

1 Like

ありがとうございます。
元データを含む画面の共有が良く分かりませんでしたので、
messageボタンより、元データをそのまま送付させて頂きました。
どうぞよろしくお願いいたします。

こんにちは

ありがとうございます。

ワークフロー側のDataTable変数は、Value側に設定する必要があります。そのため下記のようになります。(他の部分はdtのままでも動作しました。変更いただいても問題はありませんが。)

img20210602-3

データ量が多いので、もしデータ量が問題でInvokeCode内で落ちるようでしたら、
以下のInvokeCodeに差し替えてもらった方が良いかもしれません。

Sample20210601-1-v2.zip (2.8 KB)

1 Like

今回のような「データを書き換える」とかのシンプルな処理なら「繰り返しアクティビティ」を使わないと、高速化の恩恵がありますが「繰り返しアクティビティのロスが目立たない時」は使ったほうが良いと思います。

例えば、1件の処理で
画面操作したり何かを計算したりする処理:10秒
繰り返しアクティビティのロス:1秒
なら「繰り返しアクティビティ」で良いと思います。InvokeCodeで画面操作できないし。

件数だけじゃなく、処理内容に応じて使い分けが大事です。

あと、InvokeCodeは「コードが分からないには嫌がられる(RPAじゃないじゃんって言われる)」ことがあるのでご注意ください。(シンプルにわかりやすく書く、チーム内でOKもらうなどの工夫が必要)

1 Like

ありがとうございます。
その様な、からくりになっていたのですね。
大変勉強になります。
お陰様で無事にエラーなく、転記することが出来ました。
本当にありがとうございました。

ありがとうございます。
こちらの件、大変勉強になりました。
また、使う際の注意事項等も大変勉強になりました。
本当にありがとうございました。

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.