2016-12-02 4 views
3

Igniteを使用してデータ計算用のフレームワークを構築しています。 1つの大きな問題は、メモリーの使用量が予想以上のものであることです。 Ignite以外の1Gメモリを使用するデータは、Igniteキャッシュで1.5G以上を使用します。Igniteは予想以上のメモリを使用します

私はbackupとcopyOnReadを無効にしました。私はクエリ機能を使用しないので、余分なインデックススペースはありません。私はまた、各キャッシュとキャッシュエントリに使用された余分なスペースを数えました。メモリの総使用量はまだ加算されません。

各キャッシュエントリのデータ値は、大きなマップであり、プリミティブ配列のリストを含んでいます。各エントリは約120MBです。

何が問題なのですか?データ構造または構成?

答えて

1

Igniteはデータにオーバーヘッドを導入し、GBの半分はあまりにも悪いとは思わない。私は、詳細については、このガイドを参照することをお勧めいたしますでしょう:https://apacheignite.readme.io/docs/capacity-planning

+0

これはどのように発生するのですか? .5GBのオーバーヘッドではなく、データの増加に伴って30〜50%のオーバーヘッドになるようです。 (zzzと私は同じチームにいる) –

0

違いを予想し、実際のメモリ使用量が2つの要点から生じる間:

  1. 各エントリには、一定のオーバーヘッドがかかる処理のエントリのためのサポートを提供するオブジェクトで構成されていin 分散コンピューティング環境

など。あなたは整数のローカル変数を宣言することができます、それはスタックで4バイトがかかりますが、変数を長く生き、プログラムの他の場所からアクセス可能にするのは難しいです。したがって、少なくとも16バイト(300%のオーバーヘッドはありません)を消費する新しいIntegerオブジェクトを作成する必要があります。さらに、このオブジェクトを変更可能にし、複数のスレッドで安全にアクセスできないようにするには、新しいAtomicReferenceを作成し、オブジェクトを内部に格納する必要があります。総メモリ消費量は少なくとも32バイトとなります。オブジェクトの機能を拡張するたびに、オーバーヘッドが増えます。他の方法はありません。

  1. 各エントリは、特殊なシリアライズされた形式でキャッシュ内に格納されます。エントリの実際のメモリフットプリントは、フォーマットが使用されているかどうかに依存します。デフォルトではIgniteはBinaryMarshallerを使用してオブジェクトをバイト配列に変換し、この配列はBinaryObjectの内部に格納されます。

理由は簡単です。分散コンピューティングシステムは、ノード間で頻繁にエントリを交換し、キャッシュ内のすべてのエントリはバイト配列として転送する準備ができている必要があります。

articleを読んでください、それは最近更新されました。小さなエントリのエントリのオーバーヘッドは手作業で見積もることができますが、大きなエントリの場合は、キャッシュに格納されている実際のエントリをバイト配列として調べる必要があります。 withKeepBinaryメソッドを見てください。

関連する問題