3

大きなキーのメモリ使用量をテストするために、Redis で実験を行いました。私は50 ~ 60 文字(バイト) の1600 万個の文字列 をロードし、ディスク上のおよそ802 MBを Redis のソート済みセットに取りました。このソートされたセットのために3.12 GB の RAMを使い果たしました (肥大化しました) 。

次に、ディスク上の 220 MB のスペースを占有する 1600 万個の短い文字列(10 ~ 12 文字) を別の並べ替えられたセットにロードしましたが、それでも2.5 GB の RAM を使用していました。ディスク上のスペース使用量の削減率が非常に高い (~72% 削減) ことは明らかですが、Redis の並べ替えられたセットは、大きな文字列によって使用されるかなりの量のメモリを使用しています。

同じことが Redis ハッシュの場合にも当てはまります (短い文字列は、長い文字列が使用するメモリのほぼ 80% を使用します)。Redis データ構造によって使用されるメモリは、データ構造 (ソートされたセットまたはハッシュ) 内の要素の数のみに依存し、各要素の長さには依存しませんか (文字列が短い => メモリが少ないと考えるのは自然なことです)?

理由が分かれば最高です

1600 万の長い文字列は、1600 万の短い文字列とほぼ同じスペースを使用します

sorted setで、短い文字列が占めるメモリを減らすためにできることがあれば(メモリの最適化)?

4

1 に答える 1

4

この質問は次の質問に似ています: Redis 10x more memory usage than data

ソートされたセットは、Redis のメモリ効率の低いデータ構造です。これは、辞書とスキップ リストとして実装されます。両方のデータ構造には、サイズが 10、12、50、または 60 バイトを超える多数のメタデータとポインター (項目ごとに) が含まれます。

文字列のサイズに 50 バイトの違いがあっても、グローバル メモリ フットプリントに大きな違いはありません。これは、ほとんどのメモリがポインタ、メタデータ、および内部フラグメンテーションによって使用されるためです。もちろん、差が大きければ影響も大きくなります。

メモリの最適化を活用するには、データ構造を分割する必要があります (上記のリンクで説明されているように)。ハッシュまたはセットで行う方が簡単ですが、ソートされたセットでは一般的に困難 (またはまったく不可能) です。

于 2013-02-17T08:51:36.523 に答える