hishidaの開発blog

EBシリーズ(EBPocket,EBWin,EBMac,EBStudio),KWIC Finder,xdoc2txt,読書尚友の開発者ブログ

Visual Studio LARGEADDRESSAWAREオプション

先日、『EBWin4で「青空てにおは辞典完全版」に全文検索インデックスをつけようとすると、91%まで行ったところでストップする』というご指摘があった。これはEBWin4が32bitアプリのため、2GBまでしか実メモリを使えないことが原因。「青空てにおは辞典完全版」はHONMONが1.5GBもある。ちなみに、64bit対応が済んでいるEBMacだと、あっさり全文検索インデックスがつけられる。
EBWin4を64bitアプリ化すれば問題解決だが、関係するdllもすべて64bit化しなければならないなど結構ハードルが高いので、別の方法で対策をとった。
実はVisual C++では、リンクオプションに /LARGEADDRESSAWARE をつけると、32bit OSの場合3GBまで、64bit OSの場合4GBまでメモリを使用できる。

構成プロパティ->リンカー->システム->大きいサイズのアドレス->はい(/LARGEADDRESSAWARE)

C#の場合にはこの方法は使えないので、exeファイルを作成した後に、バイナリのプロパティを書き換える必要がある。

コマンドラインで、

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat

を実行して環境変数をセットしたのち、

editbin /LARGEADDRESSAWARE $(TargetPath)

を実行する。
LARGEADDRESSAWAREがついたかどうかの確認は、

dumpbin /headers $(TargetPath)

を実行して

Application can handle large (>2GB) addresses

と表示されればOK。

コンパイルの都度editbinを実行するのは面倒なので、Visual Studio でビルド後に実行するコマンドラインに指定することができる。

プロパティ->ビルドイベント->ビルド後に実行するコマンドライン

SET PATH=%PATH%;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\;c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\x86_amd64;c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools;C:\Windows\Microsoft.NET\Framework\v3.5;C:\Windows\Microsoft.NET\Framework\v4.0.30319;c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\VCPackages;
"editbin.exe" /LARGEADDRESSAWARE "$(TargetPath)"

ここで設定している環境変数は、vsvars32.bat で設定される内容なので、環境毎に異なるので注意。
これで本格的に64bit化するまでの間、32bitアプリを延命することができる。

この結果、無事EBWin4にて「青空てにおは辞典完全版」に全文検索インデックスをつけることができるようになった。
ただし、要望の多いと思われる wikipedia EPWING版は、lite版でも(解凍後)8GBあるので、相変わらずインデックスを作成できない。もっともN-gram方式だとオリジナルの100%ぐらいのサイズのインデックスが作成されるので、たとえ対応しても実用的ではないかもしれない。

全文検索インデックスについてはまだ課題が残っているので、少しずつ改良を進めるつもりでいる。まだ試していない項目は:

  • メモリマップドファイルによる高速化
  • 形態素解析とのハイブリッド、あるいは選択式