50分かかった超大容量置換が1秒に! 検索と置換がさらに速くなったEmEditorはなにを目指すのか?

500万件を秒で処理、「エディタの概念を超えた使い方をしてほしい」

「EmEditor」の検索・置換機能が極めて大幅に高速化された

 定番テキストエディタ「EmEditor Professional」は、最近の新バージョンである21.6(2022年3月)~21.8(6月)で、検索によるデータのフィルター(抽出)や、置換の機能・速度を大幅に強化した。

 その目玉は、「複数の検索文字列を同時に検索する際の新アルゴリズム」だ。これにより、フィルターや置換が圧倒的に高速化。具体的には、例えば100万件の検索・置換ペアが存在する場合、従来50分かかっていたものが、なんと0.5秒で済むようになったという。要するに「6千倍」の高速化、というわけだ。

 ここまで速くなると、もはや「便利になった」というレベルではない。「エディタの概念を超えた使い方ができるようになった」(制作者の江村氏)という。

 テキストエディタは、文章やプログラムなどのテキストファイルの編集に使われているが、昨今は、仕事のデジタル化にともない、大容量データファイルを扱うことも増えてきた。EmEditorは、こうした新しい用途にもいち早く注目、CSVファイルを扱うCSVモードや、GB単位の巨大ファイルへの対応、16TBより大きなファイルの一部だけを開く巨大ファイルコントローラーなど、テキスト形式のデータファイルを扱う機能を備えてきた。しかも、そのような巨大ファイルであっても、EmEditor最大の特徴である「高速さ」が損なわれない。

 最近の検索関連の強化は、こうした大量のデータをEmEditorで扱うときの強力な道具が加わったものといえる。そこで、今回は、この検索関連の強化・高速化について紹介していこう。

 なお、最近のEmEditorの強化ポイントとしては、Excel顔負けのピボットテーブル機能などもある。こちらについては別記事にまとめているので、参考にしてほしい。


多くの文字列を指定しての検索が圧倒的に高速に

 それでは、早速、EmEditor Professional 21.8.0の検索関連の新機能を見てみよう。

 なお、EmEditorにはProfessional(有償版)とFree(無償版)があるが、今回はいずれもProfessional版の機能。

 EmEditor公式サイトから購入できるが、年間サブスクリプション(初年度のみ 税込み5,280円、2年目以降は半額)、買い切りの永久ライセンス(税込み33,264円)から選べる。また、「EmEditor Free」をダウンロード後、試用期間の30日は「EmEditor Professional」の機能をすべて試すことができる。このほか、Windows 10/11であれば“Microsoft Store”から入手できるストアアプリ版も利用できる(年額2,350円)。機能は若干制限されるが、インストールやアップデートの手間が省ける(これらの価格は記事掲載時点のもの。為替レートの変動などにより、8月1日から価格改定される予定)

 さて、前提となる情報だが、EmEditorでは以前からの基本機能として、検索や置換のダイアログに複数の文字列を指定し、複数の検索文字列を検索したり、複数パターンの置換が行えた。

検索や置換に複数の文字列を指定(従来からの機能)


検索・置換するデータをまとめた「リンクファイル」が指定可能に

 ここに21.6からは、「リンクファイル」を指定できるようになった。

 リンクファイルはテキストファイル形式で、検索であれば検索文字列を1行に1つ、置換であれば置換前と置換後の文字列をタブ区切りで1行に1セットの形式で並べたものだ。

 これにより、大量の検索や置換を一度に指定しやすくなった。

 検索や置換のダイアログでは、「連続」をクリックして連続検索/連続置換のダイアログにしてから、複数指定するリストボックスにリンクファイルをドラッグ&ドロップすればよい。

リンクファイルをドラッグ&ドロップで指定
リンクファイルが指定された


「すべて一括置換」を新設、速度が大幅向上、「甲」と「乙」の一発入れ替えもOKに

 さらに、この複数パターンによる置換において、21.7からは、従来の「すべて連続置換」のボタンに加え、「すべて一括置換」のボタンが加わった。

 「すべて連続置換」は複数の置換を順番に置換していく処理だが、「すべて一括置換」では新しいアルゴリズムを採用。複数の置換を同時に適用する。

 そしてこの「すべて一括置換」では、大量の置換パターンがあるとき、置換速度が大幅に高速化された。

 詳しくは後で検証してみるが、なんと実測でも確かに400~1000倍以上の高速化が確認できた。ただし、アルゴリズムの都合上、「すべて一括置換」では正規表現や数値範囲表記による置換を行うと、その高速性が活かせず、動作速度が著しく低下するとのこと。

 また、速度以外に重要なのが、「同時に置換されること」だ。

 従来の「すべて連続置換」では置換を順番に適用するため、「“甲”を“乙”に」「“乙”を“甲”に」という2つの置換パターンを指定すると、“甲”をすべて“乙”に置換し終えてから、改めて“乙”をすべて“甲”に置換する。結果、“甲”だった箇所も“乙”だった箇所も、すべて“甲”になってしまう。これを避けるためには「“甲”を“丙”に」「“乙”を“甲”に」「“丙”を“乙”に」という三段階の変換をする必要があり、どうにもわかりにくい。

 それに対し、「すべて一括置換」では、両者を同時に置換を適用するため、「“甲”を“乙”に」「“乙”を“甲”に」の2つの置換パターンを指定するだけで、“甲”だった箇所は“乙”に、“乙”だった箇所は“甲”に入れ替わる形で置換される。

「甲」「乙」が含まれる文章
「“甲”を“乙”に」「“乙”を“甲”に」という2つの置換パターン
「すべて連続置換」ではすべて“甲”になってしまう
「すべて一括置換」なら、“甲”と“乙”が入れ替わる


CSVファイルの抽出も高速化

 新しい検索アルゴリズムが最も威力を発揮するのは、「高度なフィルター」機能で多数の検索文字列を指定したフィルターの機能だろう。CSVファイルのように1行に1項目のデータが記録されたテキストファイルに対して、指定した検索文字列を含む行だけを抽出できる。

 フィルター機能では、対象となるデータは膨大なものになり、さらに検索文字列も多数になることが考えられる。新しい複数の検索文字列の検索アルゴリズムにより、この抽出速度が大幅に高速化された。

 高度なフィルターでも、リンクファイル形式で多数の検索文字列を指定できる。EmEditorのツールバーの「フィルター」のところにドラッグ&ドロップするか、「高度なフィルター」のダイアログを開いてリストボックスにドラッグ&ドロップする。

フィルターを指定:ツールバーにドラッグ&ドロップする場合
フィルターを指定:高度なフィルターのダイアログにドラッグ&ドロップする場合
フィルターが動作しているところ。大幅に高速化された


速度を実測!どれだけ速いのか?

 検索や置換の機能がどれだけ速くなったか、実際に比較してみた。

 検証では、「200万件のデータが入ったファイルに対し、100万件(または1000件)に含まれるデータが入っているかどうか?」という検索/置換を行った。

 検証したのは、新アルゴリズムが採用されたEmEditor 21.8と、それらが実装される前のバージョンである21.5。

 また、こうしたデータ処理はExcelでやっている例も多いと思うが、「200万行のデータに対し、100万件(または1000件)に含まれるデータが入っているかどうか?」を抽出あるいは置換する、というのはよく考えると「Excelでは手軽な手段がない」ということがわかるだろう。

 つまり「できるだけ」でも大きなアドバンテージというわけだ。


フィルター速度は実測1,387倍!

 まずは、データのフィルター(抽出)の速度から説明していこう。

 検索対象となるファイルは、次のような形式で200万行のデータが入ったCSVファイル(Data.txt)だ。

Data.txt(抜粋)
IDs,A,B
SJG35816,aftffoym,59684989
HVX64633,dvdcbazy,22927837
OVE29196,bpghaype,51333691

 そして、「検索したい文字列」としてIDを1行ずつ並べたた以下のようなファイル(IDs.txt)を用意する。これは100万行分用意した。

 ……のだが、21.8が極めて高速なため、同じ100万行を従来の21.5で処理すると、現実的な時間で終了しない。計測に支障が出るほどだったため、「21.5での計測用」としては、その1/1,000、1千件分のIDs.txtを用意した。

IDs.txt(抜粋)
XCB21768
EAT33549
PFU81051

 なお、EmEditor 21.5ではリンクファイルに対応していないが、かわりにTSVファイルによる条件指定としてIDs.txtをインポートし、「前の条件との論理和」をオンにしてフィルタリングを実行した。

 結果の所要時間は以下のとおり。

  • EmEditor 21.8で100万件:29.9秒
  • EmEditor 21.5で千件:41.4秒

 ごくおおざっぱに、21.5での時間を1,000倍して計算すると、その差は約1,387倍。まさに「桁違い」というしかない、圧倒的な高速さだ。


置換の速度も400倍以上!

 次に、新しい「一括置換」と従来からの「連続置換」とでどのぐらい速度が違うか、EmEditor 21.8で試してみる。

 IDs.txtはフィルタと同様のものを用い、そのIDの文字列を置換する想定で、次のようにタブ区切りで置換前と置換後の文字列を並べた(IDsReplace.txt)を用意する。これを連続置換ダイアログに読み込ませて、「すべて一括置換」と「すべて連続置換」をそれぞれ実行してみる。

IDsReplace.txt
XCB21768        SPC17553
EAT33549        OGL33072
PFU81051        WSH37055

 フィルターと同様に、こちらも性能差がありすぎるため、置換パターンとして「すべて連続置換」では1千行のファイルを、「すべて連続置換」では100万行と1千行のファイルを用いた。

 結果の所要時間は以下のとおりだ。

  • すべて一括置換:(100万行)4.9秒
  • すべて一括置換:(1千行)0.45秒
  • すべて連続置換(1千行):181.2秒

 1千行どうしの比較では約400倍。「すべて連続置換」の1千行の結果を1千倍して「すべて一括置換」の100万行の結果と比較すると、約36,755倍。おおざっぱな計算だが、圧倒的な差となった。


エディタの概念を超えたフィルタ・検索機能はなぜできたのか?

 こうしたエディタの概念を超えたフィルター・検索機能がなぜできたのかを、開発者である江村豊氏にお伺いした。


データベースやスクリプトが必須な処理も、エディタで手軽に

――高速なフィルター検索や一括置換などの機能はなぜ実装しようと思ったのでしょうか。

[江村氏] やはり一番大きな動機は高速化です。EmEditorでは、巨大ファイルを高速に開くことができます。検索や置換もすでに充分に高速化されています。しかし、何百万個以上の多くの文字列を一度に検索や置換するとなると、EmEditorでも時間がかかる処理になっていました。

 あるお客様が質問サイト「Stack Overflow」への投稿で、2500万件の電話番号リストでファイルを検索できないかを質問していました。せっかく巨大ファイルを開くことができても、このような検索処理に時間がかかってしまっていては、EmEditorを使う意味が薄れてしまいます。

 この問題についてしばらく考えていましたが、高速なアルゴリズムを考えついたので実装し、非常に多くの検索文字列を一括検索する場合でも高速に検索できるようにしました。いままでであれば、データベースを使ったりスクリプトを使ったりしていたことが、テキストエディタで完結できるようになります。これまでの「エディタ」の概念を超える速度が実現できたと思いますし、そうした新しい使い方ができるようになったと自負しています。


「500万件のデータから、200万人の名前リストを抽出する」処理もわずか数秒

――具体的な利用分野・活用方法などのイメージがあれば、教えてください。

[江村氏] たとえば、人口500万人のある都市で、ワクチン接種券を配布対象市民のマイナンバーの一覧があったとします。その一覧には、200万人のマイナンバーが含まれています。そして、市民のマイナンバーと関連付けられた住所や氏名などの情報が、500万行のファイルに入っているとします。市役所の作業者は、この500万行のファイルから200万人のマイナンバーを含む行を抽出しなければならないとします。このような場合、以前のバージョンのEmEditorでは難しかったのですが、v21.6では通常で数秒以内に抽出できるようになりました。

 別の例としては、ある会社で、500万人顧客リストのCSVファイルがあったとします。その中で、ある製品のリコールが発生して、その製品の所有者200万人全員に連絡しなければならないとします。そして、対象者の情報はメールアドレスだけで、顧客リストと別のファイルになっていたとします。すると、その会社の作業者は、500万行のファイルから200万人分の一覧を抽出しなければなりません。このような作業も、以前のバージョンでは遅くてできませんでしたが、最新版では、一瞬に抽出できるようになりました。

――そうした自治体や大企業の大規模データでの採用はたくさんあるのでしょうか。

[江村氏] 用途は詳しく聞いていませんが、自治体も含めてかなりあります。日本の省庁もありますし、EUや米国の組織などもあります。

 大規模データでは、たとえばCSV形式の顧客リストの解析などに使われていて、CSVの解析に便利な機能の要望が多くなっています。最近追加したピボットテーブルの機能も、大規模データを扱う会社からの要望でした。そのようなお客様は、EmEditorで多くのマクロを書いて、CSVなどの巨大ファイルを多く処理しています。EmEditorと私のファンだと書いていただいたこともあり、ご愛用いただいております。

 また、セキュリティのデジタルフォレンジックの分野では、巨大なサーバーログファイルを開いて分析するのにも使われています。


「文書を1回スキャンするだけ」の新アルゴリズムで高速化

――今回の機能は、かなり高速に動くようですが、どうしてここまでの速度が出るのでしょうか?

[江村氏] 簡単に言うと、従来の検索では、文書から検索文字列を検索していました。新しいアルゴリズムでは、逆に、検索文字列から文書を検索しているというイメージです。

 検索文字列がN個存在しているとします。従来の連続検索では、1個の検索文字列を検索する動作をN回繰り返すため、文書をN回スキャンします。したがって、この場合の計算時間は、“O(N) ”、つまりNに比例する時間がかかります。

 一方、新しい一括検索では、文書をスキャンする回数は1回だけです。

 文書の最初から1文字ずつスキャンしていき、それをN個の検索文字列のいずれかと一致するかどうか調べるわけです。さらに、N個の検索文字列と比較するときに、検索文字列があらかじめABC順でソートされていれば、二分探索 (バイナリ サーチ) が可能になります。二分探索の計算時間は“O(log N)”、つまりNの対数に比例する時間になります。この違いは、Nが非常に大きな数の場合に、大きな時間の差になります。

――高速化にあたって、目標や、意識していた相手などはあるでしょうか。

[江村氏] 巨大ファイルを扱う検索や置換の場合には、コマンドラインでPythonのようなスクリプト言語を使った方が効率がいいという意見もあります。しかし、スクリプト言語を使っても、アルゴリズムが悪ければ高速にはなりません。EmEditorでは、Windowsアプリの使いやすいGUIを備えながら、最適化されたアルゴリズムとコードを使用して、高速な動作を実現しています。

 また、「すべて一括置換」では、速度だけでなく結果も変わってきます。一括置換の結果としては、従来の「すべて連続置換」より新しい「すべて一括置換」のほうが多くの人の感覚に合っていると思います。


「こだわりのエディタ」としてのEmEditor品質やセキュリティ、「見えない文字」対策も……

――せっかくなので、そのほかのことも聞かせてください。EmEditorは「こだわりが多いエディタ」という印象がありますが、開発にあたり、どのようなこだわりがあるのでしょうか。

[江村氏] 「他のテキストエディターにはなく、EmEditorでしかできない」という機能は、特に重視して開発しています。巨大ファイルへの対応や、高速な検索と置換、CSVへの対応などはその一例です。

 また、基本性能や、品質、セキュリティにもかなり気を使っています。

 EmEditorの多くの機能は、Gitリポジトリにコードをpushするたびに、専用マシンで自動的にテストが行われます。もしコードの修正により何かの不具合が発生したら、それがすぐにフィードバックされて修正するという作業を迅速に行うことができます。さらに、プログラムのビルドはボタン1つで、そこから一般への公開もボタン1つで行うことができます。このリリース作業の間に人的なミスやウィルスなどが入る余地はありません。

 2014年には、EmEditorの更新チェックの機能を利用したハッキングが起こる可能性があるという脆弱性が発見され、大変なご迷惑とご心配をおかけしてしまいました。この時の教訓を生かし、現在では、更新チェッカー自体も、ダウンロードするプログラムに、弊社と全く同じ名前と住所のデジタル署名が付いているプログラム以外はダウンロードできないように、改良を加えています。

 EmEditor自体にも、セキュリティを意識した機能を追加しています。テキストファイルには、U+200B(ZERO WIDTH SPACE)という非表示文字(目に見えない文字)や、U+0081といった制御文字が含まれている可能性があります。Webからソースコードをコピー&ペーストした場合に、悪意のある非表示文字や制御文字が含まれていると、場合によっては、脆弱性が入ってしてしまう危険があります。EmEditorでは、そのような非表示文字や制御文字を可視化して、標準で強調表示します。保存時にも、それらの文字が入っていると警告を発生させることも可能です。

 このように、EmEditorは、単に多機能や高速化するだけでなく、基本性能、品質、セキュリティにもこだわって開発を続けています。



「速度を求めて高価なパソコンを買うより、ソフトを最適化して快適にしたい」

――特に高速化には強いこだわりがあるように思いますが、なぜでしょうか。

[江村氏] 多くのソフトウェアは、まだ充分に最適化できていないと思います。少しコードを変えれば、数倍にも数十倍にも高速になるにもかかわらず、充分に高速化されていないのが実情です。マルチスレッドや拡張命令セットはおろか、64ビット化でさえも進んでいないのが現状だと思います。

 多くのユーザー様は、少しでも速いCPUを求めて高価なパソコンを購入しようとします。しかし、実はソフトウェアを少し最適化するだけで、高価なハードウェアを買う以上の結果を生みます。これは、ある種、もったいないように思います。ユーザーの皆様は、ソフトウェア会社に、もっとアプリの高速化、最適化を要求するべきだと思います。

 私は、マルチスレッドや、64ビット化、拡張命令セットの利用など、現在可能な方法を使用して、EmEditorを極限まで高速化し、ユーザーの皆様に喜んでいただきたいと考えています。

――そのほか、今、注目している機能などがあったら教えてください。

[江村氏] 近い将来のバージョンでは、Gitに対応し、現在開いているファイルの変更履歴や以前のバージョンとの比較を表示できるようにしたいと考えています。この機能は、プラグインとして提供され、弊社によって開発されています(注:インタビュー後にリリースされた21.8では、まずGitリポジトリのコミット履歴を表示するプラグインが追加された)。

 また、CSV の解析で便利な機能、例えば、水平にスクロールしても特定の列を常に表示する機能なども、さらに充実させていきたいと考えています。

 さらに、長期的には、マクロに使用している JavaScript をもっとモダンなバージョンに改良したり、プログラム開発のための便利な機能をより多く取り入れていきたいと考えています。

――ありがとうございました。

[制作協力:Emurasoft, Inc.]

ソフトウェア情報

「EmEditor Professional」
【著作権者】
Emurasoft, Inc.
【対応OS】
64bit版を含むWindows 7/8.1/10およびWindows Server 2008 R2以降
【ソフト種別】
シェアウェア 年額税込み5,280円(2年目以降は半額、永久ライセンスは税込み33,264円、30日間の試用期間後は個人利用に限り機能制限のある無償版「EmEditor Free」として使用可能)(8/1に価格改定される予定
【バージョン】
21.8.0(22/6/24)