2GBの壁を越える?!

今日はMetaTrader4 の2GBの壁について説明したいと思います。


1つの PC 上で、大量の MT4 を起動させたい場合、32bitOS では、デスクトップヒープを増やす設定をする必要があります。この辺りは、mystさんの解説が参考になると思います。
2GBの壁は、それとは全く別の話で、1つのMT4 が使えるメモリが2GB までという制約のことです。非常にヘビーな使い方をしない限り、この制約が問題になることは無いのですが、大量のチャート表示をさせるなど無理をすると、not enough memory というエラーが起こります。

↑2005年から現在までの1分足チャートを11枚表示させて発生したエラー。
普通はこの時点で諦めるところですが、それではつまらないので、ちょっとアレしてみます..。




まず、Windows上で動作する 32bitアプリが使用できるメモリ容量は、以下のようになっています。

OS 普通の32bitアプリ 特別な32bitアプリ
XP (32bit) 2GB 2GB
XP (32bit,3GBオプション有り) 2GB 3GB
XP (64bit) 2GB 4GB

terminal.exe は、普通の32bitアプリなので、OSの種類に関係なく、利用できるメモリは2GBまでです。64bitOSにしてメモリを何ギガ搭載しても、1つのterminal.exe は、2GBしか使えません。しかし、"特別な32bitアプリ" に変えてしまえば、OSによっては、3GB〜4GB まで利用可能となります。
この "特別な32bitアプリ" というのが、EXE内の IMAGE_FILE_LARGE_ADDRESS_AWARE bit を on にしたアプリのことで、今回試そうとしていることが、この辺りにそっくり解説されています。



詳細はリンク先や、ぐぐって調べてもらったらと思いますが、要点をまとめると
・terminal.exe にLARGE_ADDRESS_AWARE bitを付与する。
・XP(32bit)を /3GBオプションで起動するか、64bitOS を使う。
という2条件を満たせば、利用可能メモリが3GB〜4GBになる..かもしれないということです。
(但し、terminal.exeが正式対応している訳ではないので動作は無保証)
http://www.ntcore.com/4gb_patch.php ←このツールで変更してもOKです。(2011.10.31)





以下、実際に試して見ました。
(1) まずは、dumpbin でLARGE_ADDRESS_AWARE bitが付与されていないことを確認します。

↑Application can handle large (>2GB) addresses という記述が無いので、フラグが付与されていないことが分かります。



(2) editbin で、LARGE_ADDRESS_AWARE bitを付与します。

↑付与後に、dumpbin で確認すると、Application can handle large (>2GB) addresses が表示されます。


(3) 64bitOS で、 2005年から現在までの1分足チャートを複数枚開いてみました。

↑オリジナルでは、11枚開いた時点で、not enough memory エラーが発生し、チャート画面が Waiting for update のままで開けなくなりました。

↑LARGE_ADDRESS_AWARE bitを付与した改造版では、2GBの壁を越えることができ、12枚目以降も問題なく開けました。




not enough memory エラーで困っている人は、このテクニックを試してみると良いと思いますが、大半のユーザにはどうでもいい話ですよね..笑。