Metatrader 5 - 循环播放图表中的符号时占用大量内存 - 页 4

 
Carl Schreiber:

你是否尝试过用 TerminalInfoInteger(..)来设置TERMINAL_MAXBARS 到一个合理的小值?

除此以外,你还有。

Terminal_memory_physical

系统中的物理内存,Mb

int

Terminal_memory_total

终端进程可用的内存,Mb

int

终端_内存_可用

终端进程的可用内存,Mb

int

终端_内存_使用

终端使用的内存,Mb

int


来检查问题的关键在哪里。

我把TERMINAL_MAXBARS 设置为500(真的很低),但它仍然在加载更多的条形图(想象那是来自文件?

已经开始记录上面列出的内存计数器,很快会有一些反馈。

好吧得到了一些反馈,它看起来有点奇怪。下面是两个日志 "MetaTrader日志 "和 "PowerShell日志",它们是我正在运行的两个日志,记录内存使用情况。(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日志
##### 这是我在Metatrader的记录器记录的。它输出所有的内存

时间 终端_内存_物理 终端_内存_总数 终端_内存_可用 已使用的终端内存
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### PowerShell日志
#### 这是由PowerShell脚本记录的

04/29/2016 17:31:32 使用中的公斤级字节 128 300 K
04/29/2016 18:05:08 使用中的Kilo Bytes 215 488 K

 
gr101:

我把TERMINAL_MAXBARS 设置为500(真的很低),但它仍然在加载更多的条形图(想象那是来自文件?

已经开始记录上面列出的内存计数器,很快会有一些反馈。

好吧得到了一些反馈,它看起来有点奇怪。下面是两个日志 "MetaTrader日志 "和 "PowerShell日志",它们是我正在运行的两个日志,记录内存使用情况。(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日志
##### 这是我在Metatrader的记录器记录的。它输出所有的内存

时间 终端_内存_物理 终端_内存_总数 终端_内存_可用 已使用的终端内存
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### PowerShell日志
#### 这是由PowerShell脚本记录的

04/29/2016 17:31:32 使用中的公斤级字节 128 300 K
04/29/2016 18:05:08 使用中的Kilo Bytes 215 488 K

我(笔记本,8GB内存,Win7-64)的4个mt4的内存用量各不相同。

我认为这没什么好担心的!

还有多少GB是空闲/可用的?

 
Carl Schreiber:

我(笔记本,8GB内存,Win7-64)的4个mt4的内存用量相当。

我想这不是你要担心的问题!

还有多少GB是空闲/可用的?

我在图表中的上述水平上有大量的内存。问题是,当我让它运行时,它慢慢地推高了内存的使用率。

因此,大约一两个小时后,它就开始达到最大值了。

我目前在2012年服务器上运行EA,7GB内存,4个核心(不确定它们是什么),64位。

 
gr101:

我在图表中的上述水平上有大量的内存。问题是,当我让它运行时,它慢慢地把内存用量推高。

因此,大约一两个小时后,它就开始达到最大值了。

我目前在2012年服务器上运行EA,7GB内存,4个核心(不确定它们是什么),64位。

我曾经了解到,这似乎是Win-Server在内存中保持尽可能多的功能。

我定期重启终端,但我很好奇这是否会导致崩溃

 
Carl Schreiber:

我曾经了解到,这似乎是Win-Server的一个特点,即在内存中保持尽可能多的内容。

我定期重新启动终端,但我很好奇这是否会导致崩溃

有趣的是......尽管它似乎与加载符号到市场观察中和退出有关。

终端并没有崩溃,只是开始运行得非常慢,慢得无法使用。

 
gr101:

有趣的是......尽管它似乎与加载符号到市场观察中和退出有关。

终端并没有崩溃,只是开始运行得非常慢,慢得无法使用。

你如何检查 这个?也许服务器没有设置成快速的图形处理机器,而只是快速的数学计算和快速的网络响应?
 

这是一个标准的Server 2012的安装。然而,我的理论是,如何设置并不重要。随着时间的推移,内存泄漏总是会占用机器上的所有空间。

因此,不管这个盒子有多快或有多少内存,如果它有一个泄漏,那么它就会在某些时候达到极限。

 

只是想就这个话题贡献我的2分钱。

这里有很多关于内存泄漏和增加的好主意,但关于这个话题和根本原因,我的考虑是。

- 公布的源代码没有检查几个相关的函数 返回,例如SymbolSelect()返回。

- 基于函数返回的for/while循环,比如SymbolsTotal()可以有一些限制或保护,以防止一些错误的函数返回值。

在强调/改变代码并再次测试后,也许我们可以找到并证明问题的根本原因。

 

我认为Rogerio Figurelli 是正确的,如果许多函数调用没有被返回,分配的内存就不会被释放。

也许你可以减少堆栈大小,看看是否会出现堆栈溢出错误。

堆栈

在每个MQL4程序中,分配了一个特殊的内存区域,称为堆栈,用于存储自动创建的本地函数变量。所有的函数都分配一个堆栈。默认的堆栈大小为256kb,堆栈大小可以使用#property stacksize 编译器指令来管理。

静态 局部变量存储在与其他静态变量和全局变量 相同的地方--在一个特殊的内存区域,它与堆栈分开存在。动态创建 的变量也使用一个与堆栈分开的内存区域。

随着每个函数的调用,堆栈上的一个位置被分配 给内部非静态变量。在退出函数后,该内存可再次使用。

如果从第一个函数开始,第二个函数被调用,那么第二个函数就会从剩余的堆栈内存中为其变量占用所需的大小。因此,当使用包含的函数时,堆栈内存将被每个函数依次占用。这可能导致在某个函数调用过程中出现内存短缺,这种情况被称为堆栈溢出。

因此,对于大的本地数据,你最好使用动态内存--当进入一个函数时,在系统中分配内存,这是本地需要的(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
 

说得好。

我将在某个时候试一试,并将结果反馈给大家。

谢谢