一時的な保存のために内部的にバッファを多用するパッケージを書いています。1024 個の要素から始めて、必要に応じて 2 倍に拡大する単一のグローバル (エクスポートされていない) バイト スライスがあります。
ただし、私のパッケージのユーザーが、大きなバッファーが割り当てられるような方法でパッケージを使用する可能性が非常に高いですが、その後パッケージの使用を停止し、割り当てられたヒープ スペースを大量に浪費する可能性があり、私には方法がありません。バッファを解放するかどうかを知る (または、これは Go であるため、GC にします)。
私は 3 つの可能な解決策を考えましたが、どれも理想的ではありません。私の質問は次のとおりです。これらの解決策のいずれか、またはおそらく私が考えていなかった解決策は、このような状況での標準的な方法ですか? 標準的な慣行はありますか?他のアイデアはありますか?
- ねじ込め。
しかたがない。これに対処するのは非常に困難であり、割り当てられたメモリをそのままにしておくことはそれほど悪いことではありません。
このアプローチの問題は明らかです。問題は解決しません。
- 「終了しました」または「内部メモリ使用量を縮小する」機能をエクスポートしました。
パッケージによって使用される内部ストレージを解放する、ユーザーが呼び出すことができる関数をエクスポートします (インテリジェントに呼び出すことは明らかにユーザー次第です)。
このアプローチには 2 つの問題があります。第 1 に、ユーザーへのインターフェイスがより複雑になり、すっきりしなくなります。第二に、そのような関数をいつ呼び出すのが賢明なのかをユーザーが知ることは不可能または実用的ではない可能性があるため、とにかく役に立たない可能性があります。
- パッケージが一定期間使用されなくなった後にバッファーを解放するゴルーチンを実行するか、バッファーのサイズがしばらく増加していない場合は常にバッファーを縮小します (おそらく長さを半分にします)。
このアプローチの問題点は、主に、スケジューラに不要な負荷がかかることです。明らかに、単一のゴルーチンはそれほど悪くはありませんが、これが受け入れられた慣行である場合、インポートしたすべてのパッケージが内部でこれを行っているとうまくスケーリングできません。また、時間に敏感なアプリケーションを使用している場合、知らないうちにコードを実行したくない場合があります (つまり、関数が呼び出されていないときは、パッケージは何も動作していないと想定する場合があります。合理的な仮定、私は言うだろう)。
それで...何かアイデアはありますか?
注:ここで既存のプロジェクトを確認できます(関連するコードは数十行のみです)。