技術とか戦略とか

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

サクラエディタのマクロに大量(500以上)のコマンドを記述すると一部コマンドが実行されなくなる(推測)

スペックの高いPC(詳細は後述)の場合、サクラエディタのマクロに大量(500以上)のコマンドを記述し実行した時に一部コマンドが実行されなくなる現象を確認しました。
現象が発生するPCの場合、コマンド数が600程度の時に発生したり発生しなかったりし、700を超えるとほぼ確実に発生するので、サクラエディタのスレッドの最大数が500か512あたりで実装されていて、何れかのスレッドが解放される前に次の処理を実行すると…という話なのかなと勝手に想像しています。
私の想像が的外れの可能性も高いので、どのような現象なのかは再現手順を見て各自で判断してください。
 
先日の「サクラエディタのマクロ(置換処理記述)をバッチから並列実行すると処理が競合する」という話もあるので、ちょっとしたフォーマット変換や修正作業なら良いのですが、移行作業でサクラエディタのマクロを使うのはあまりお勧めできないです。
多少面倒でも、javaか何かでプログラムを作った方が良いと思います。
 
【現象が発生するPC】
(恐らく)スペックの高いPCで発生します。
現場にはスペックの高いPCと低いPCがあり、高いPCでのみ発生しました。
(コマンド数は約800)
現場のPCのスペックを勝手に公開して良いか微妙なので、スペックは伏せます。
 
参考情報として、以下のスペックを持つ私の自宅のPCでは5回中1回発生しました。
(1003コマンドの場合)
 
・OS
 Windows 8.1
 
・プロセッサ
 Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz 2.40GHz
 
・実装メモリ
 8.00GB
 
【現象の再現手順】
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://akira2kun.hatenablog.com/entry/2018/09/16/103138
 
3.処理対象のファイルを用意する
上記記事の例で言うと、
workフォルダ内に任意のファイルを格納する。
 
4.2で作成したバッチを起動する
 
5.サクラエディタで開かれた3のファイルが閉じられないことを確認する。
 
【現象の回避方法】
1つのマクロの中のコマンド数が多くならないように、マクロを分割する。
少なくとも、コマンド数が100程度であれば、
「WinClose( );」により必ず自動的にファイルは閉じられる。
(10000回以上試したが全て自動的に閉じられた)