ホームページ  >  記事  >  バックエンド開発  >  String Interning は Go データ構造のメモリ使用量をどのように最適化できますか?

String Interning は Go データ構造のメモリ使用量をどのように最適化できますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-28 05:50:02825ブラウズ

 How Can String Interning Optimize Memory Usage in Go Data Structures?

Go のガベージ コレクションとポインター: データ構造の最適化の例

問題の理解

Python や Ruby などの言語とは異なり、Go での文字列操作、文字列データへのポインターの処理が含まれます。提供されたコード例では、画像タグを画像 URL のリストにマッピングするデータ構造を作成することを目的としています。ただし、単純なアプローチでは文字列値を値ごとにコピーする必要があるため、データ構造が大きくなるとメモリ効率が低下する可能性があります。

例でのポインタの使用法

最初のソリューションでは、画像 URL へのポインタを使用します。値ごとにコピーするのではなく、文字列をコピーします。ただし、このアプローチには制限があります。

  • バージョン 1: Image struct フィールド (URL など) へのポインタを保存すると、構造体全体がメモリ内に保持されるため、メモリ管理が非効率になります。
  • バージョン 2: URL を中間変数にコピーし、それへのポインターを使用すると、メモリを大幅に節約できずに不必要な複雑さが生じます。

最適なメモリ使用量

最適なメモリ使用量を実現するには、Go の文字列値は本質的にポインタであることを考慮する必要があります。文字列値を格納すると、その長さに関係なく、16 バイトの構造体がコピーされます。文字列プールまたは「インターナー」を使用すると、文字列の出現を追跡し、新しい文字列記述子を作成する代わりに既存の文字列記述子を再利用できます。

文字列インターニング

私たちのソリューションには、文字列をキャッシュする単純な文字列インターナーが含まれています値を取得し、重複が見つかった場合は既存の記述子を返します。文字列を「インターニング」することで、同じ文字列値が出現するすべてが単一の文字列記述子を指すようになり、メモリ消費が最小限に抑えられます。

結果

結果のコードは次のとおりです。

<code class="go">result := searchImages()

tagToUrlMap := make(map[string][]string)

for _, image := range result {
    imageURL := interned(image.URL)

    for _, tag := range image.Tags {
        tagName := interned(tag.Name)
        tagToUrlMap[tagName] = append(tagToUrlMap[tagName], imageURL)
    }
}

// Clear the interner cache:
cache = nil</code>

このソリューションは、過度の複雑さを導入することなく文字列インターンを使用することでメモリ使用量を最小限に抑えます。

追加の最適化

  • 余分な容量を削除するためのスライスのトリミング: tagToUrlMap を構築した後、私たちはgetTagToUrlMapマップを範囲にして、スライスを必要に応じてテトリムします。cap(urls)>len(urls)の場合に実行し、スライスのサイズを縮小します。これがappend()により追加された余裕のある容量を取り除きます。

以上がString Interning は Go データ構造のメモリ使用量をどのように最適化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。