Metatrader 5 - 循环播放图表中的符号时占用大量内存 - 页 4 1234 新评论 gr101 2016.04.29 17:08 #31 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脚本在这个主题的前面,我更新了它以符合任务管理器中的内容)。这两个日志都是我做最后一次运行时的第一次和最后一次。 兴趣点。 TERMINAL_MEMORY_PHYSICAL和TERMINAL_MEMORY_TOTAL保持不变。这些值在整个日志中的每一行都是相同的。 TERMINAL_MEMORY_AVAILABLE从13902 下降到13806。TERMINAL_MEMORY_USED已经从432 增加到528。在测试期间,系统使用的千字节数从启动时的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 Metatrader 5 - Takes Carl Schreiber 2016.04.29 18:55 #32 gr101:我把TERMINAL_MAXBARS 设置为500(真的很低),但它仍然在加载更多的条形图(想象那是来自文件?已经开始记录上面列出的内存计数器,很快会有一些反馈。好吧得到了一些反馈,它看起来有点奇怪。下面是两个日志 "MetaTrader日志 "和 "PowerShell日志",它们是我正在运行的两个日志,记录内存使用情况。(PowerShell脚本在这个主题的前面,我更新了它以符合任务管理器中的内容)。这两个日志都是我做最后一次运行时的第一次和最后一次。 兴趣点。 TERMINAL_MEMORY_PHYSICAL和TERMINAL_MEMORY_TOTAL保持一致。这些数值在日志中的每一行都是相同的。 TERMINAL_MEMORY_AVAILABLE从13902 下降到13806。TERMINAL_MEMORY_USED已经从432 增加到528。在测试期间,系统使用的千字节数从启动时的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是空闲/可用的? gr101 2016.04.29 20:18 #33 Carl Schreiber:我(笔记本,8GB内存,Win7-64)的4个mt4的内存用量相当。我想这不是你要担心的问题!还有多少GB是空闲/可用的?我在图表中的上述水平上有大量的内存。问题是,当我让它运行时,它慢慢地推高了内存的使用率。 因此,大约一两个小时后,它就开始达到最大值了。 我目前在2012年服务器上运行EA,7GB内存,4个核心(不确定它们是什么),64位。 Carl Schreiber 2016.04.30 11:42 #34 gr101:我在图表中的上述水平上有大量的内存。问题是,当我让它运行时,它慢慢地把内存用量推高。 因此,大约一两个小时后,它就开始达到最大值了。 我目前在2012年服务器上运行EA,7GB内存,4个核心(不确定它们是什么),64位。我曾经了解到,这似乎是Win-Server在内存中保持尽可能多的功能。我定期重启终端,但我很好奇这是否会导致崩溃 gr101 2016.04.30 18:57 #35 Carl Schreiber:我曾经了解到,这似乎是Win-Server的一个特点,即在内存中保持尽可能多的内容。我定期重新启动终端,但我很好奇这是否会导致崩溃有趣的是......尽管它似乎与加载符号到市场观察中和退出有关。终端并没有崩溃,只是开始运行得非常慢,慢得无法使用。 Carl Schreiber 2016.05.01 15:43 #36 gr101:有趣的是......尽管它似乎与加载符号到市场观察中和退出有关。终端并没有崩溃,只是开始运行得非常慢,慢得无法使用。 你如何检查 这个?也许服务器没有设置成快速的图形处理机器,而只是快速的数学计算和快速的网络响应? gr101 2016.05.02 17:44 #37 这是一个标准的Server 2012的安装。然而,我的理论是,如何设置并不重要。随着时间的推移,内存泄漏总是会占用机器上的所有空间。 因此,不管这个盒子有多快或有多少内存,如果它有一个泄漏,那么它就会在某些时候达到极限。 Rogerio Figurelli 2016.05.03 05:22 #38 只是想就这个话题贡献我的2分钱。这里有很多关于内存泄漏和增加的好主意,但关于这个话题和根本原因,我的考虑是。- 公布的源代码没有检查几个相关的函数 返回,例如SymbolSelect()返回。- 基于函数返回的for/while循环,比如SymbolsTotal()可以有一些限制或保护,以防止一些错误的函数返回值。在强调/改变代码并再次测试后,也许我们可以找到并证明问题的根本原因。 Marco vd Heijden 2016.05.03 09:05 #39 我认为Rogerio Figurelli 是正确的,如果许多函数调用没有被返回,分配的内存就不会被释放。也许你可以减少堆栈大小,看看是否会出现堆栈溢出错误。堆栈 在每个MQL4程序中,分配了一个特殊的内存区域,称为堆栈,用于存储自动创建的本地函数变量。所有的函数都分配一个堆栈。默认的堆栈大小为256kb,堆栈大小可以使用#property stacksize 编译器指令来管理。 静态 局部变量存储在与其他静态变量和全局变量 相同的地方--在一个特殊的内存区域,它与堆栈分开存在。动态创建 的变量也使用一个与堆栈分开的内存区域。 随着每个函数的调用,堆栈上的一个位置被分配 给内部非静态变量。在退出函数后,该内存可再次使用。 如果从第一个函数开始,第二个函数被调用,那么第二个函数就会从剩余的堆栈内存中为其变量占用所需的大小。因此,当使用包含的函数时,堆栈内存将被每个函数依次占用。这可能导致在某个函数调用过程中出现内存短缺,这种情况被称为堆栈溢出。 因此,对于大的本地数据,你最好使用动态内存--当进入一个函数时,在系统中分配内存,这是本地需要的(new,ArrayResize()),当退出函数时,释放内存(delete,ArrayFree())。 参见 数据类型,类型的封装和可扩展性,变量的初始化,变量的可见性范围和寿命,创建和删除对象 Program Properties (#property) - Preprocessor - Language Basics - MQL4 Reference docs.mql4.com Program Properties (#property) - Preprocessor - Language Basics - MQL4 Reference gr101 2016.05.04 18:02 #40 说得好。 我将在某个时候试一试,并将结果反馈给大家。 谢谢 1234 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
你是否尝试过用 TerminalInfoInteger(..)来设置TERMINAL_MAXBARS 到一个合理的小值?
除此以外,你还有。
Terminal_memory_physical
系统中的物理内存,Mb
int
Terminal_memory_total
终端进程可用的内存,Mb
int
终端_内存_可用
终端进程的可用内存,Mb
int
终端_内存_使用
终端使用的内存,Mb
int
来检查问题的关键在哪里。
我把TERMINAL_MAXBARS 设置为500(真的很低),但它仍然在加载更多的条形图(想象那是来自文件?
已经开始记录上面列出的内存计数器,很快会有一些反馈。
好吧得到了一些反馈,它看起来有点奇怪。下面是两个日志 "MetaTrader日志 "和 "PowerShell日志",它们是我正在运行的两个日志,记录内存使用情况。(PowerShell脚本在这个主题的前面,我更新了它以符合任务管理器中的内容)。这两个日志都是我做最后一次运行时的第一次和最后一次。
兴趣点。
##### MetaTrader日志
##### 这是我在Metatrader的记录器记录的。它输出所有的内存
#### PowerShell日志
#### 这是由PowerShell脚本记录的
04/29/2016 17:31:32 使用中的公斤级字节 128 300 K
04/29/2016 18:05:08 使用中的Kilo Bytes 215 488 K
我把TERMINAL_MAXBARS 设置为500(真的很低),但它仍然在加载更多的条形图(想象那是来自文件?
已经开始记录上面列出的内存计数器,很快会有一些反馈。
好吧得到了一些反馈,它看起来有点奇怪。下面是两个日志 "MetaTrader日志 "和 "PowerShell日志",它们是我正在运行的两个日志,记录内存使用情况。(PowerShell脚本在这个主题的前面,我更新了它以符合任务管理器中的内容)。这两个日志都是我做最后一次运行时的第一次和最后一次。
兴趣点。
##### MetaTrader日志
##### 这是我在Metatrader的记录器记录的。它输出所有的内存
#### 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是空闲/可用的?
我(笔记本,8GB内存,Win7-64)的4个mt4的内存用量相当。
我想这不是你要担心的问题!
还有多少GB是空闲/可用的?
我在图表中的上述水平上有大量的内存。问题是,当我让它运行时,它慢慢地推高了内存的使用率。
因此,大约一两个小时后,它就开始达到最大值了。
我目前在2012年服务器上运行EA,7GB内存,4个核心(不确定它们是什么),64位。
我在图表中的上述水平上有大量的内存。问题是,当我让它运行时,它慢慢地把内存用量推高。
因此,大约一两个小时后,它就开始达到最大值了。
我目前在2012年服务器上运行EA,7GB内存,4个核心(不确定它们是什么),64位。
我曾经了解到,这似乎是Win-Server在内存中保持尽可能多的功能。
我定期重启终端,但我很好奇这是否会导致崩溃
我曾经了解到,这似乎是Win-Server的一个特点,即在内存中保持尽可能多的内容。
我定期重新启动终端,但我很好奇这是否会导致崩溃
有趣的是......尽管它似乎与加载符号到市场观察中和退出有关。
终端并没有崩溃,只是开始运行得非常慢,慢得无法使用。
有趣的是......尽管它似乎与加载符号到市场观察中和退出有关。
终端并没有崩溃,只是开始运行得非常慢,慢得无法使用。
这是一个标准的Server 2012的安装。然而,我的理论是,如何设置并不重要。随着时间的推移,内存泄漏总是会占用机器上的所有空间。
因此,不管这个盒子有多快或有多少内存,如果它有一个泄漏,那么它就会在某些时候达到极限。
只是想就这个话题贡献我的2分钱。
这里有很多关于内存泄漏和增加的好主意,但关于这个话题和根本原因,我的考虑是。
- 公布的源代码没有检查几个相关的函数 返回,例如SymbolSelect()返回。
- 基于函数返回的for/while循环,比如SymbolsTotal()可以有一些限制或保护,以防止一些错误的函数返回值。
在强调/改变代码并再次测试后,也许我们可以找到并证明问题的根本原因。
我认为Rogerio Figurelli 是正确的,如果许多函数调用没有被返回,分配的内存就不会被释放。
也许你可以减少堆栈大小,看看是否会出现堆栈溢出错误。
堆栈
在每个MQL4程序中,分配了一个特殊的内存区域,称为堆栈,用于存储自动创建的本地函数变量。所有的函数都分配一个堆栈。默认的堆栈大小为256kb,堆栈大小可以使用#property stacksize 编译器指令来管理。
静态 局部变量存储在与其他静态变量和全局变量 相同的地方--在一个特殊的内存区域,它与堆栈分开存在。动态创建 的变量也使用一个与堆栈分开的内存区域。
随着每个函数的调用,堆栈上的一个位置被分配 给内部非静态变量。在退出函数后,该内存可再次使用。
如果从第一个函数开始,第二个函数被调用,那么第二个函数就会从剩余的堆栈内存中为其变量占用所需的大小。因此,当使用包含的函数时,堆栈内存将被每个函数依次占用。这可能导致在某个函数调用过程中出现内存短缺,这种情况被称为堆栈溢出。
因此,对于大的本地数据,你最好使用动态内存--当进入一个函数时,在系统中分配内存,这是本地需要的(new,ArrayResize()),当退出函数时,释放内存(delete,ArrayFree())。
参见
数据类型,类型的封装和可扩展性,变量的初始化,变量的可见性范围和寿命,创建和删除对象
说得好。
我将在某个时候试一试,并将结果反馈给大家。
谢谢