我正在编写一个包,它在内部大量使用缓冲区进行临时存储。我有一个全局(但未导出)字节片,我从 1024 个元素开始,并根据需要加倍增长。
但是,我的包的用户很可能会以一种导致分配大缓冲区的方式使用它,然后停止使用该包,从而浪费大量分配的堆空间,我没有办法知道是否释放缓冲区(或者,因为这是 Go,让它被 GC 处理)。
我想到了三种可能的解决方案,但都不是理想的。我的问题是:这些解决方案中的任何一个,或者我没有想到的解决方案,在这种情况下是否是标准做法?有什么标准做法吗?还有其他想法吗?
- 算了。
那好吧。处理这个太难了,并且留下分配的内存还不错。
这种方法的问题很明显:它不能解决问题。
- 导出“我完成了”或“缩小内存使用”功能。
导出一个用户可以调用的函数(并且智能地调用它显然取决于他们),这将释放包使用的内部存储。
这种方法的问题是双重的。首先,它为用户提供了一个更复杂、更不干净的界面。其次,用户可能无法知道何时调用这样的函数是明智的,因此无论如何它可能是无用的。
- 运行一个 goroutine,在包未使用一段时间后释放缓冲区,或者在一段时间内没有增加缓冲区大小时缩小缓冲区(可能将长度减半)。
这种方法的问题主要在于它给调度程序带来了不必要的压力。显然,单个 goroutine 并没有那么糟糕,但如果这是公认的做法,那么如果您导入的每个包都在后台执行此操作,它就不会很好地扩展。此外,如果您有一个对时间敏感的应用程序,您可能不希望代码在您不知道的情况下运行(也就是说,您可能假设包在其函数未被调用时没有做任何工作 - a合理的假设,我会说)。
所以......有什么想法吗?
注意:您可以在此处查看现有项目(相关代码只有几十行)。