技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

サクラエディタのマクロで大量のコマンドを実行した場合の予期せぬ挙動

この記事は、以下の2記事をまとめたものになります。
 
サクラエディタのマクロ(置換処理記述)をバッチから並列実行すると処理が競合する
https://akira2kun.hatenablog.com/entry/2019/03/11/234403
 
サクラエディタのマクロに大量(500以上)のコマンドを記述すると一部コマンドが実行されなくなる(推測)
https://akira2kun.hatenablog.com/entry/2019/03/12/231720
 
----
 
サクラエディタの Ver2.2.0.1 にて、マクロで大量の処理を行った場合に、以下の2つの事象が発生することを確認しています。
1.サクラエディタのマクロをコマンドラインから並列実行すると処理が競合する
2.サクラエディタのマクロに数百以上のコマンドを記述すると一部コマンドが実行されなくなる可能性がある
 
大量の処理が必要な場合は、C#Java等のプログラミング言語で処理を実装することをお勧めします。
 
以下、事象の詳細です。
 
----
 
【事象1】
■事象名
サクラエディタのマクロをコマンドラインから並列実行すると処理が競合する
 
■事象内容
サクラエディタのマクロは、コマンドラインから実行することができる。
また、コマンドライン実行は、複数のプロセスで行うこともできる。
しかし、複数のプロセスでこれを行うと、お互いのプロセスで処理が競合し、あるプロセスの処理が他のプロセスの処理に影響を与えてしまう。
 
■再現手順
1.以下のように、1000個の置換処理をマクロに記載する。
S_ReplaceAll('hoge1000', 'fuga1000', 62); // すべて置換
S_ReplaceAll('hoge999', 'fuga999', 62); // すべて置換
S_ReplaceAll('hoge998', 'fuga998', 62); // すべて置換



S_ReplaceAll('hoge3', 'fuga3', 62); // すべて置換
S_ReplaceAll('hoge2', 'fuga2', 62); // すべて置換
S_ReplaceAll('hoge1', 'fuga1', 62); // すべて置換
S_ReDraw(0); // 再描画
FileSave( ); // 上書き保存
WinClose( ); // 閉じる
 
2.1で作成したマクロを以下の記事の要領でバッチから起動可能にする。
サクラエディタのマクロをバッチファイルで複数ファイルに対して実行 
https://cyzennt.co.jp/blog/2019/04/13/%e3%82%b5%e3%82%af%e3%83%a9%e3%82%a8%e3%83%87%e3%82%a3%e3%82%bf%e3%81%ae%e3%83%9e%e3%82%af%e3%83%ad%e3%82%92%e3%83%90%e3%83%83%e3%83%81%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%a7%e8%a4%87%e6%95%b0/
 
3.処理対象のファイルを用意する
workフォルダ内に、以下のように置換対象の文字を含むファイルを格納する。
hoge1000
hoge999
hoge998



hoge3
hoge2
hoge1
 
4.2~3のフォルダ構成を複数作成する。
tmpフォルダをコピーしtmp2フォルダを作成する。
(バッチファイルの1行目・5行目の記述もフォルダ名に合わせて変更する)
 
5.4の各々のフォルダで同時にバッチファイルを起動させる。
 
6.workフォルダ内のファイルを開き、競合の発生を確認する。
(実行例)
fuga1000
fuga999
fuga998



fuga3
fuga2
fuga1
 
とならず、「hoge951」が「fuga920」になる等不正な結果になる。
 
----
 
【事象2】
■事象名
サクラエディタのマクロに数百以上のコマンドを記述すると一部コマンドが実行されなくなる可能性がある
 
■事象内容
サクラエディタのマクロに600以上のコマンドを記述し、最後に"WinClose( );"を記述した場合、"WinClose( );"が実行されない場合があることを確認した。
コマンド数が多ければ多いほど、PCのスペックが高ければ高いほど、事象が発生する確率が高いと思われる。
 
参考までに、下記のスペックのPCの場合、コマンド数1003で事象が発生することを確認している。
 
・OS:Windows8.1 64bit
・CPU:Inter(R) Core(TM) i5-4210U CPU @ 1.70GHz 2.40GHz
・メモリ:8.00GB
・ディスク:SSD 128GB
 
■再現手順
前述のスペックのPCの場合の再現手順である。
 
1.1003個のコマンドをマクロに記述する。
S_ReplaceAll('hoge1000', 'fuga1000', 62); // すべて置換
S_ReplaceAll('hoge999', 'fuga999', 62); // すべて置換
S_ReplaceAll('hoge998', 'fuga998', 62); // すべて置換



S_ReplaceAll('hoge3', 'fuga3', 62); // すべて置換
S_ReplaceAll('hoge2', 'fuga2', 62); // すべて置換
S_ReplaceAll('hoge1', 'fuga1', 62); // すべて置換
S_ReDraw(0); // 再描画
FileSave( ); // 上書き保存
WinClose( ); // 閉じる
 
2.1で作成したマクロを以下の記事の要領でバッチから起動可能にする。
サクラエディタのマクロをバッチファイルで複数ファイルに対して実行 
https://cyzennt.co.jp/blog/2019/04/13/%e3%82%b5%e3%82%af%e3%83%a9%e3%82%a8%e3%83%87%e3%82%a3%e3%82%bf%e3%81%ae%e3%83%9e%e3%82%af%e3%83%ad%e3%82%92%e3%83%90%e3%83%83%e3%83%81%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%a7%e8%a4%87%e6%95%b0/
 
3.処理対象のファイルを用意する
workフォルダ内に任意のファイルを格納する。
 
4.2で作成したバッチを起動する
 
5.サクラエディタで開かれた3のファイルが"WinClose( );"により閉じられないことを確認する。