- 作成者投稿
- 2024年9月30日 2:37 am #31960Applek参加者
シングルラインモードの標準機能で高速化
EmEditorで正規表現のマクロは9割以上をシングルラインモードでやっています。
100万字ぐらいのテキストファイルになると通常の1行ずつ探索するやり方では何十倍も重くなって動作が止まってしまいます
そこでいったん全ての行を一行にしてしまって数十万字を一括で正規表現の最短一致指定で代用して処理速度を数十倍速くするという方法です。
自分で出来る代用方法は以下です。
1行ずつでやるとフリーズして止まってしまいます。そのため1行で並列処理したほうが数十分の1の負荷で済みます。\nを⏎に代用させて処理していきます。そのため通常の^.*?の場合は⏎[^⏎]*?に代用して処理します。
100万字以内のテキストファイルだと通常の\nのままより数十倍速く軽く動作しますので最近では99%以上がこのやり方です。// シングルラインモードサンプルマクロ
batch_list = editor.filters; batch_list.AddReplace("\\n","⏎",eeFindReplaceRegExp,0);// 最初にシングルラインにする batch_list.AddReplace("(⏎[^⏎❖]*?)■([^⏎❖]*?)◆","$1〘しかく〙$2〘ひしがた〙",eeFindReplaceRegExp | eeFindReplaceCase,0); batch_list.AddReplace("⏎","\\n",eeFindReplaceRegExp,0);// 最後にマルチラインモードに戻す
課題
● [^⏎❖◆]{1,500000}?このような範囲指定の大きい数字指定が出来ないので使えないシチュエーションがあります。
● 数億字になると1行として認識しなくなります。何かこの解決方法で良いアイデアがありましたら教えていただけますと幸いです。
2024年9月30日 6:06 am #31961Applek参加者最後の閉じを忘れてました。
batch_list = editor.filters; batch_list.AddReplace("\\n","⏎",eeFindReplaceRegExp,0);// 最初にシングルラインにする batch_list.AddReplace("(⏎[^⏎❖]*?)■([^⏎❖]*?)◆","$1〘しかく〙$2〘ひしがた〙",eeFindReplaceRegExp | eeFindReplaceCase,0); batch_list.AddReplace("⏎","\\n",eeFindReplaceRegExp,0);// 最後にマルチラインモードに戻す document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);
2024年9月30日 6:09 am #31962Applek参加者.*?の代わりに[^⏎]*?とすることで実質的にこの方法でも改行を超えてマッチすることはありません。
5000行のテキストファイルであっても1行として並列に処理できます。2024年10月1日 9:39 am #31966Applek参加者お世話になっております。
[^❖◆]{1,500000}?このような範囲指定の大きい数字指定が出来ないのは鬼雲の仕様かと思いますが、大きな数字が指定できなくて支障が出ております。
何か代替方法はありませんでしょうか?
今のところ100万字以内のデータでやることが多いですが、今後には支障が出ます。
以前の質問では正規表現の仕様だからEmEditorは関係ありませんという感じの返答でした。EmEditorはビッグデータ対応と言うことですが、ビッグデータが開けるだけなのと実用レベルで編集できるソフトウェアかは別の問題です。
通常の書き方だとビッグデータを実質的に処理するのは実用的ではないです。莫大な時間が掛かります。
だいたい数十倍かに数百倍は掛かると思います。下手すると数日待っていないと処理が終わりません。
そのためこの方法でないと無理ですが、上記の壁があります。
よろしくお願いいたします。 - 作成者投稿
- このトピックに返信するにはログインしてください。