Applekdz
@Applekdz

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

EmEditorでbatch_list.AddReplaceによる置換のとき区切り方の違いだけで処理速度が大きく変わることについて

お世話になっております。
以下のようなことを設定で変更して速くすることは可能でしょうか?
batch_list.AddReplaceによる置換は以下のように一括で大量ではなく、一旦閉じて少ない項目ずつ区切ると数倍速くなることがわかりました。
本質的にはまったく同じ処理です。

大量のデータベースを置換のデータにして置換をしていく場合です。
まず処理が遅くなるパターン

batch_list = editor.filters;
batch_list.AddReplace("","",eeFindReplaceRegExp,0);// このパターンを10万行ぐらいに1回で並べる
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);// 閉じる

これを上記の方法をひとつのマクロで3000行ずつくらいに小刻みに区切りました。

batch_list = editor.filters;
batch_list.AddReplace("","",eeFindReplaceRegExp,0);// このパターンを3000行ぐらいに並べる
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);
batch_list = editor.filters;
batch_list.AddReplace("","",eeFindReplaceRegExp,0);// このパターンを3000行ぐらいに並べる
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);
batch_list = editor.filters;
batch_list.AddReplace("","",eeFindReplaceRegExp,0);// このパターンを3000行ぐらいに並べる
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);
batch_list = editor.filters;
batch_list.AddReplace("","",eeFindReplaceRegExp,0);// このパターンを3000行ぐらいに並べる
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);
batch_list = editor.filters;
batch_list.AddReplace("","",eeFindReplaceRegExp,0);// このパターンを3000行ぐらいに並べる
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);
batch_list = editor.filters;
batch_list.AddReplace("","",eeFindReplaceRegExp,0);// このパターンを3000行ぐらいに並べる
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);

これを繰り返して小刻みに閉じます。

このように少ない行数で一旦閉じて、もういっかいbatch_list = editor.filters;と
区切っていくのを繰り返すだけで処理自体は同じなのに上記の1回で10万行くらいにするよりも4倍くらい速くなりました。

これは、設定によって1回閉じだけでも同様に速くすることは可能でしょうか?
EmEditorの設定項目の問題なのか、ユーザー側では変更できない問題か?です。

私の場合は数万字程度でやってますがマクロの行数が100万行以上で置換対象文字数が100万字とか1000万字になるともっと処理速度が何十倍も大差がつく可能性があります。

よろしくお願いいたします。

追記
別の方法で速度の違いをテストしてみました。
BatchReplaceのマクロは約78000行
文字数は約14万字

まず3000行程度にマクロを区切った場合は約8秒でしたが
区切らないで一番最初と最後の行だけに
batch_list = editor.filters;
78000行のマクロ
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);

このようにした場合は2分39秒くらいでした。

このことから本質的に同じ処理をやっているに過ぎないのに、区切るだけで速度がまったく変わるというのは処理アルゴリズムの最適化がされていないということではないでしょうか?
よろしくお願いいたします。

0

1Answer

EmEditor v21.6.1 または v21.6.903 以上であることを確認してから、次のように eeExFindLinkFile フラグを使用してリンク ファイルを使用してください。リンク ファイルには、Tab で区切られた検索文字列と置換後文字列のペアを改行で区切って複数個指定できます。

batch_list = editor.filters;
batch_list.AddReplace("E:\\Test\\LinkFile.txt","",eeFindReplaceRegExp,eeExFindLinkFile );
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);

リンク ファイル (上記サンプルの E:\Test\LinkFile.txt) の中身の例 (UTF-8 または UTF-16 で保存してください、\t は Tab を表します)

検索文字列1\t置換文字列1
検索文字列2\t置換文字列2
...\t...
1Like

Comments

  1. @Applekdz

    Questioner

    バージョンアップしていただき、ありがとうございます。
    御厚意、感謝しております。

Your answer might help someone💌