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