Go 我怎样才能使围棋程序使用更多的内存?建议这样做吗?

Go 我怎样才能使围棋程序使用更多的内存?建议这样做吗?,go,memory-management,Go,Memory Management,我正在寻找类似于Java中的-Xmx的选项,即分配Go应用程序可以使用的最大运行时内存。正在检查,但不完全是这样 我尝试用func SetMaxStack设置类似的内容,可能非常愚蠢 debug.SetMaxStack(5000000000) // bytes model.ExcelCreator() 我之所以希望这样做,是因为目前有足够的可用RAM,但应用程序消耗的RAM不会超过4-6%,我在这里可能是错的,但这可能会迫使GC比需要的速度快得多,从而导致性能问题 我在做什么 从RDBMS系统

我正在寻找类似于Java中的-Xmx的选项,即分配Go应用程序可以使用的最大运行时内存。正在检查,但不完全是这样

我尝试用func SetMaxStack设置类似的内容,可能非常愚蠢

debug.SetMaxStack(5000000000) // bytes
model.ExcelCreator()
我之所以希望这样做,是因为目前有足够的可用RAM,但应用程序消耗的RAM不会超过4-6%,我在这里可能是错的,但这可能会迫使GC比需要的速度快得多,从而导致性能问题

我在做什么

从RDBMS系统中获取大数据集,并将其处理成excel格式

我寻找这样一个选项的另一个原因是限制最终部署它的服务器上RAM的最大使用量


如果您对此有任何提示,我们将不胜感激。

当前稳定的Go 1.10只有一个旋钮,可以通过Go运行时执行的垃圾收集来用内存换取较低的CPU使用率。 这个旋钮叫做GOGC,其说明如下

GOGC变量设置初始垃圾收集目标百分比。当新分配的数据与上次收集后剩余的实时数据的比率达到此百分比时,将触发收集。默认值为GOGC=100。设置GOGC=off将完全禁用垃圾收集器。运行时/调试包的SetGCPercent函数允许在运行时更改此百分比。看

因此,基本上将其设置为200会使正在运行的进程的Go运行时可能使用的内存量增加一倍

话虽如此,我还是要指出,Go运行时实际上试图根据您正在运行的程序的工作负载和手头的CPU处理能力来调整其垃圾收集器的行为。 我的意思是,通常情况下,如果收集器在不影响性能的情况下以足够快的速度清除垃圾,那么程序不消耗大量RAM也没有什么问题,我认为没有理由担心:Go的GC是 运行时最激烈的微调之一, 实际上效果非常好

因此,您可以尝试走另一条路线:

配置程序的内存分配。 分析概要文件并尝试找出热点所在 以及是否以及如何对其进行优化

你可以开始了 并继续与无数的其他 这东西

优化。通常,这相当于制作某些缓冲区 可在对相同函数的不同调用之间重用 食用它们,预先分配切片,而不是种植切片 逐渐地,在认为有用的地方使用sync.Pool等

这些措施实际上可以增加记忆 真正使用的是,由活动对象而不是 垃圾,但它可能会降低GC的压力


你想解决的问题是什么?听起来你的程序没有使用你期望的那么多内存,但为什么会有问题?Go会使用它需要的内存量,如果程序不需要内存,你希望占用多少内存?零碎地使用它。首先禁用Excel everything,也就是说,只需处理数据并丢弃结果,而不是真正确保您(比如说fmt)。将它们打印到io/ioutil.Discard中,以便编译器不会完全优化代码,并测量其运行情况。如果速度慢,或者至少能想出一个简单的MCVE让我们看一下你的代码。@JimB,正如我在问题中提到的,我可能是错的,但我认为既然go并没有真正使用太多内存,可能会尝试使用有限的内存,如果存在默认内存消耗定义的内存,并且太频繁地调用GC。所以,最后,这个问题似乎是这个问题的一个经典案例@SUP,请首先考虑将问题分解为从DBMS获取数据的逻辑片段,处理它,生成它的Excel文档,然后配置文件,然后尝试提出不同的问题,然后再确定您将要识别的具体问题。- Xmx与GC没有真正的关系,不过,它只是最大堆大小,当然,你不能在围棋中真正地调整它。@JimB,当然,但是一个更相关的旋钮可能会出现,请看和。这并不是限制堆的使用,因为任何经验丰富的Java开发人员都从来之不易的经验中知道,堆的使用毫无用处,而是向正在运行的程序提供关于达到内存限制的反馈。@kostix感谢您的解释,这无疑有助于加深我的理解。将按照您的建议/评论进行工作。