パフォーマンスの問題 – Robot Framework vs Python

私は現在、テキストファイルの内容を2つの部分に分け、これらの2つの部分をそれぞれ含む2つの新しいファイルを作成することを可能にするキーワードの開発に取り組んでいます。
ファイル形式はCSVファイルと似ていますが、セパレータは ‘|’ (パイプ)。
ファイルサイズは比較的大きいです。ここでは、10以上の列を含む約125,000行について説明しています。
私は、以下のように、Robot Frameworkに直接キーワードを書き込もうとしました:

Split Files
    [Arguments]    ${filePath}    ${nbOfColumns}    ${separator}=|    
    OperatingSystem.File Should Exist    ${filePath}      msg=The file ${filePath} doesn't exist!
    ${fileContent} =    OperatingSystem.Get File    ${filePath}    encoding_errors=ignore
    @{lines} =    String.Split To Lines    ${fileContent}        
    : FOR    ${line}    IN    @{lines}
        ${rest}    ${last} =    CsvDiffLibrary.Split String From Right    ${line}    2
        OperatingSystem.Append To File    ${filePath}_old    ${rest}${n}
        OperatingSystem.Append To File    ${filePath}_new    ${last}${n}

問題は、このキーワードの実行には、1000行のファイルの場合は約5秒、2000行のファイルの場合は10秒かかります。つまり、ファイル全体で約10分かかります。それはまったく強力ではなく、受け入れられるものではありません。
(ファイル全体を処理するための情報については、5分間の実行後にテストを停止するように強制しました)

だから、私はPythonでキーワードを書くことに決めましたが、Robot
Frameworkから同じPythonライブラリを再利用することにしました:

def split_file(self, path, nb_of_columns):
    OperatingSystem().file_should_exist(path)
    file_content = OperatingSystem().get_file(path, encoding_errors='ignore')
    lines = String().split_to_lines(file_content)
    for line in lines:
        rest, last = self.split_string_from_right(line, nb_of_columns)
        OperatingSystem().append_to_file(path + "_old", rest + "n")
        OperatingSystem().append_to_file(path + "_new", last + "n")

これはまったく同じことに気づくでしょうが、この方法では1000行の処理が瞬間的で、ファイル全体(123K行)は20秒で処理されます。

だから私の質問は簡単です…なぜですか?なぜRobot
Frameworkで書かれたキーワードとPythonで書かれたキーワードとの違いが大きいのですか?私の知る限りでは、Robot
FrameworkはPythonで完全に書かれています。それほど大きなオーバーヘッドはありません。

ありがとう、

ベストアンサー

だから私の質問は簡単です…なぜですか?なぜRobot
Frameworkで書かれたキーワードとPythonで書かれたキーワードとの違いが大きいのですか?私の知る限りでは、Robot
FrameworkはPythonで完全に書かれています。それほどオーバーヘッドはありません。

おそらく、それほどオーバーヘッドではない
ことはありますが、実際にはオーバーヘッドが多くあります。オーバーヘッドはさまざまな形で現れます。

  • ロボットフレームワークキーワードでは、キーワードを呼び出すたびにログファイルに行が追加されます。さらに、繰り返しごとに行が追加されています。
    Pythonベースのキーワードの中からキーワード関数を呼び出すと、それらのステートメントは記録されません。具体的には、ロボット専用ソリューションを使用すると、ロギング情報が500,000行追加されます(125,000行×反復ごとに4つのログ文)

  • ロボットがコードを解析しなければならないオーバーヘッドがありますが、これは小さくても重要ではありません。

  • ロボットはキーワードをPython関数にマップするためにルックアップを行う必要があります。また、そのオーバーヘッドは小さいものの、それほど重要ではありません。あなたのpythonバージョンでは、そのオーバーヘッドを排除する関数を直接呼び出しています。

私は余分な時間の大部分が、起こっている余分なログの膨大な量に関係していると考えています。


注:メモリ内のすべてを行い、新しいファイルを1回だけ書き込んだ場合、おそらくpythonキーワードを一桁高速にすることができます。または、ループの前に一度ファイルを開き、functinoを呼び出すのではなく、直接データを書き込んでください。相対的に言えば、すべての反復で
OperatingSystem()。append_to_file
を呼び出すことは、毎回ファイルを開いたり、書き込んだり閉じたりする必要があるため、非常に遅くなります。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です