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