Metatrader 5 - シンボルを通してチャートを循環させるとき、多くのメモリを消費します。 - ページ 4

 
Carl Schreiber:

TerminalInfoInteger(...)、TERMINAL_MAXBARS を適当な小さい値に設定してみましたか?

その横であなたが持っている

Terminal_Memory_Physical

システム内の物理メモリ、Mb

int

ターミナル_メモリ_合計

端末のプロセスで利用可能なメモリ、Mb

int

端末のメモリ使用量

端末のプロセスの空きメモリ、Mb

int

ターミナル_メモリ_使用済み

端末が使用しているメモリ , Mb

int


を見て、どこが肝心なのかを確認します。

TERMINAL_MAXBARSを500(本当に低い)に 設定しましたが、まだ多くのバーをロードしており(ファイルからだと想像してください)、メモリはまだ忍び足になって います。

上記のメモリカウンターを記録し始めたので、すぐにフィードバックが得られると思います。

Okはいくつかのフィードバックを得て、それは少し奇妙に見えます。以下は、「MetaTrader Log」と「PowerShell Log」の2つのログで、私が実行している2つのログは、メモリ使用量を記録しているものです。(PowerShellスクリプトはこのスレッドで先にあり、私はタスクマネージャにあるものと一致するようにそれを更新しました)。これらのログの両方は、私が最後に実行したときの最初と最後の時間です。

注目すべき点

  1. TERMINAL_MEMORY_PHYSICALとTERMINAL_MEMORY_TOTALは同じままです。これらの値は、ログを通してすべての行で同じです。
  2. TERMINAL_MEMORY_AVAILABLEは、13902から 13806に 減少しています。
  3. TERMINAL_MEMORY_USEDは432から 528に 増加しました。
  4. システムが使用するキロバイト数は、テスト期間中、起動時の128 300 K (128.3 Mb) から 215 488 K (215.488 Mb) に増加しました。

#### MetaTrader Log
##### これは、MetaTraderの私のロガーによって記録されました。全てのメモリが出力されます

時間 端末のメモリ物理量 端末のメモリ総量 ターミナル_メモリ_使用可能 ターミナル_メモリ_使用済み
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### PowerShellのログ
#### これはPowerShellスクリプトによって記録されたものです。

2016/04/29 17:31:32 Kilo Bytes in use 128 300 K
04/29/2016 18:05:08 使用キロバイト数 215 488 K

 
gr101:

TERMINAL_MAXBARSを500(本当に低い)に 設定しましたが、まだ多くのバーをロードしており(ファイルからだと想像してください)、メモリはまだ忍び足になって います。

上記のメモリカウンターを記録し始めたので、すぐにフィードバックが得られると思います。

Okはいくつかのフィードバックを得て、それは少し奇妙に見えます。以下は、「MetaTrader Log」と「PowerShell Log」の2つのログで、私が実行している2つのログは、メモリ使用量を記録しているものです。(PowerShellスクリプトはこのスレッドで先にあり、私はタスクマネージャにあるものと一致するようにそれを更新しました)。これらのログの両方は、私が最後に実行したときの最初と最後の時間です。

注目すべき点

  1. TERMINAL_MEMORY_PHYSICALとTERMINAL_MEMORY_TOTALは同じままです。これらの値は、ログを通してすべての行で同じです。
  2. TERMINAL_MEMORY_AVAILABLEは、13902から 13806に 減少しています。
  3. TERMINAL_MEMORY_USEDは432から 528に 増加しました。
  4. システムが使用するキロバイト数は、テスト期間中、起動時の128 300 K (128.3 Mb) から 215 488 K (215.488 Mb) に増加しました。

#### MetaTrader Log
##### これは、MetaTraderの私のロガーによって記録されたものです。全てのメモリが出力されます

時間 端末のメモリ物理量 端末のメモリ総量 ターミナル_メモリ_使用可能 ターミナル_メモリ_使用済み
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### PowerShellのログ
#### これはPowerShellスクリプトによって記録されたものです。

2016/04/29 17:31:32 Kilo Bytes in use 128 300 K
04/29/2016 18:05:08 使用キロバイト数 215 488 K

私(ノート、8GB ram、Win7-64)は、4台のmt4それぞれで同等のram使用量です。

気にすることはないと思いますよー。

まだ何GBくらい空いているのでしょうか?

 
Carl Schreiber:

私(ノート、8GB ram、Win7-64)は、4つのmt4それぞれについて同等のram使用量です。

心配することはないと思います!

まだ何GB空いているのでしょうか?

グラフの上のレベルでは、RAMに負荷がかかっています。問題は、起動したままにしておくと、徐々にRAM使用量が増えていくことです。

1~2時間後に最大になります。

現在、EAをServer 2012、7GB RAM、4コア(何コアかは不明)、64ビットで動かしています。

 
gr101:

グラフの上のレベルでは、RAMに負荷がかかっています。問題は、起動したままにしておくと、徐々にRAM使用量が増えていくことです。

1時間か2時間後には最大値になります。

現在、EAをServer 2012、7GB RAM、4コア(何であるか不明)、64ビットで動かしています。

以前、Win-Serverの機能で、メモリにできるだけ多くのものを保持するようだと知りました。

端末は定期的に再起動していますが、これでクラッシュするのかどうか気になるところです

 
Carl Schreiber:

Win-Serverの機能で、メモリにできるだけ多くのデータを保存しているようだと知ったことがあります。

私は定期的にターミナルを再起動しましたが、これがクラッシュの原因になるのかどうか気になりますね

面白いですね...Market Watchへのシンボルのロードと取り出しに関係しているようですが。

ターミナルがクラッシュすることはなく、ただ本当に遅く、使い物にならないほど遅く動作するようになりました。

 
gr101:

興味深いことに、Market Watchへのシンボルのロードと取り出しに何か関係があるようです。

ターミナルはクラッシュしませんが、動作がとても遅くなり、使い物にならないほどです。

どのように確認 するのですか?もしかしたら、サーバーがグラフィック用の高速マシンとしてセットアップされているのではなく、高速な計算と素早いウェブレスポンス用にセットアップされているのかもしれませんね?
 

Server 2012の標準インストールです。しかし、私の理論では、どのようにセットアップされても問題ありません。メモリリークは時間が経てば必ずマシンの全領域を占有する。

つまり、いくら高速で、いくら多くのRAMを搭載していても、リークがあれば、いつかは限界に達してしまうのです。

 

このトピックについて、私の2セントで貢献したいと思います。

メモリリークや増加に関する良いアイデアがたくさんありますが、このトピックと根本的な原因に関して私が考えていることは以下の通りです。

- 公開されているソースコードでは、例えばSymbolSelect()の戻り値のような、いくつかの関連する関数の 戻り値をチェックしていません。

- SymbolsTotal()のような関数の戻り値に基づくfor/whileループは、間違った値の関数の戻り値に対する何らかの制限または保護がある可能性があります。

コードを修正し、再度テストすれば、問題の根本的な原因を見つけることができるかもしれません。

 

Rogerio Figurelliの 言う通り、多くの関数呼び出しが返されない と、 割り当てられたメモリは解放さ れませんね。

スタックサイズを小さくして、スタックオーバーフローエラーが発生するかどうか確認してみてください。

スタック

すべてのMQL4プログラムでは、スタックと呼ばれる特別なメモリ領域が、自動的に作成されるローカル関数変数を格納するために割り当てられています。すべての関数に対して1つのスタックが割り当てられます。デフォルトのスタックサイズは256kbですが、#property stacksize コンパイラーディレクティブを使用してスタックサイズを管理することができます。

静的な ローカル変数は、他の静的変数やグローバル 変数と同じ場所、つまりスタックとは別に存在する特別なメモリ領域に格納されます。動的に 生成された変数も、スタックとは別のメモリ領域を使用します。

関数を呼び出すたびに、スタック上に 内部非静的変数用の領域が確保 されます。関数を終了すると、そのメモリは再び使用できるようになります。

最初の関数から 2 番目の関数が呼び出された場合、2 番目の関数は残りのスタックメモリから必要なサイズの変数を占めます。このように、インクルード関数を使用する場合、スタックメモリは関数ごとに順次占有されることになります。このため、ある関数を呼び出す際にメモリ不足になることがあり、このような状況をスタックオーバーフローと呼びます。

そのため、大きなローカルデータを扱う場合は、ダイナミックメモリを使用したほうがよいでしょう。関数を呼び出すときに、ローカルで必要なメモリをシステムに確保し (new,ArrayResize())、関数を終了するときにメモリを解放します (delete,ArrayFree())。

以下も参照してください。

データ型型のカプセル化と拡張性変数の初期化変数の可視範囲と有効期限オブジェクトの作成と削除

Program Properties (#property) - Preprocessor - Language Basics - MQL4 Reference
Program Properties (#property) - Preprocessor - Language Basics - MQL4 Reference
  • docs.mql4.com
Program Properties (#property) - Preprocessor - Language Basics - MQL4 Reference
 

良い点ですね。

今度試してみて、結果をここにフィードバックしたいと思います。

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